<<<<<<< HEAD ======= >>>>>>> master Identier les facteurs latents en SHS avec R <<<<<<< HEAD ======= >>>>>>> master

Identier les facteurs latents en SHS avec R

Exemples d’application sur des données en Géographie et en Psychologie en utilisant le couple analyse factorielle exploratoire (AFE) / analyse factorielle confirmatoire (CFA)

Grégoire Le Campion (Passages, CNRS)

Solenne Roux (LabPsy, Université de Bordeaux)

featured

Cette fiche présente deux méthodes d’analyse factorielle et leurs applications sous R. Ces méthodes cousines de l’analyse en composante principale, s’en distinguent notamment car elles permettent de mettre en évidence des facteurs latents plutôt que des composantes principales. Cette approche par les facteurs latents est surtout utilisée en Psychologie. Moins répandue dans les autres disciplines des sciences humaines et sociales, elle pourrait néanmoins s’avérer particulièrement utile pour répondre à des hypothèses ou besoins particuliers dans toutes les disciplines des SHS.

Pré-requis : Connaissances de base en traitement et analyse de données. Être familier des risques induits par les outliers, la multicolinéarité, etc. dans la modélisation statistique.

Introduction

1 L’analyse factorielle

Comment rendre compte, de manière simple, de la complexité des différents types de relations qui existent entre plusieurs variables d’une base de données ?

C’est à cette question que permet, entre autre, de répondre l’analyse <<<<<<< HEAD multivariée, et par extension les méthodes d’analyses factorielles qui ======= multivariée, et par extension les méthodes d’analyse factorielle qui >>>>>>> master appartiennent à ce champs de méthodes.

1.1 L’Objectif de l’analyse factorielle ?

L’objectif général de l’analyse factorielle est de réduire un nombre important d’informations (c’est-à-dire les valeurs contenues dans différentes variables) à quelques grandes dimensions. Il s’agit de synthétiser l’information. Par exemple, imaginons des chercheurs souhaitant étudier le comportement de préservation de l’environnement des français. Pour cela, ils récoltent différentes données concernant le statut socioprofessionnel des participants, leur état de santé, leur zone géographique d’habitation, leur implication dans des associations, etc. Ils recueillent donc beaucoup de données dans chacun des différents thèmes susceptibles d’expliquer leurs hypothèses. Afin de synthétiser l’information alors recueillie, et éventuellement par la suite de pouvoir dégager des profils de comportement ou des liens de causalités, <<<<<<< HEAD ils feront appel à l’une des méthodes de factorisation existante.

======= ils feront d’abord appel à l’une des méthodes de factorisation existante.

>>>>>>> master

Comme dans toute analyse statistique, on va chercher à expliquer la plus forte proportion de la variance (de la covariance dans le cas de l’analyse factorielle) par un nombre aussi restreint que possible de variables (appelées dans l’analyse factorielle composantes ou facteurs).

1.2 Les différents types d’analyses factorielles

L’analyse factorielle est, elle aussi, un regroupement de différentes méthodes dont les plus connues et les plus utilisées en SHS sont, pour les données quantitatives : l’analyse en composante principale (ACP) et l’analyse factorielle exploratoire (AFE) ; et pour les données qualitatives : l’analyse factorielle des correspondances (AFC) et l’analyse des correspondances multiples (ACM).

Ici nous vous parlerons des méthodes de l’analyse factorielle <<<<<<< HEAD exploratoire (AFE ou EFA en anglais) et de l’analyse factorielle ======= exploratoire (AFE, ou EFA en anglais) et de l’analyse factorielle >>>>>>> master confirmatoire (CFA en anglais) qui sont des méthodes très employées en psychologie notamment.

Ces différentes méthodes, si elles ont toutes l’objectif commun que nous avons exprimé précédemment, ont aussi des différences importantes.

Pour mieux comprendre, un rapide retour historique sur ces méthodes est utile.

1.3 Petite histoire des analyses factorielles

Les premiers à théoriser les méthodes d’analyses factorielles sont le mathématicien britannique Karl Pearson (1901) et le psychologue anglais Charles Spearman (1904).

Pearson développera sa réflexion sur les analyses en compostantes principales (ACP) (Pearson F.R.S., K., 1901). Alors que Spearman se concentrera sur l’analyse factorielle, afin de rendre compte de la variance commune partagée par les items d’un même outil psychométrique (Spearman, C., 1904). Ces pionniers des analyses factorielles travaillaient déjà sur les corrélations, et ce sont ces mêmes personnes qui ont donné leurs noms aux coefficients de corrélation de Pearson et de Spearman.

Mais c’est notamment avec les travaux du mathématicien français Jean-Paul Benzecri (Benzecri J.-P., 1973), dans les années 70, que ces méthodes vont connaître leur essor en France (Pages, J-P., et al., 1979). En particulier grâce à l’apport des représentations graphiques qui permettent de venir synthétiser et illustrer les résultats. C’est Benzecri qui va développer les méthodes sortant du modèle gaussien en prenant en compte les variables catégorielles, telles que les analyses factorielles des correspondances (AFC) et les analyses factorielles des correspondances multiples (ACM)(Pages, J-P., et al., 1979).

Si les méthodes popularisées par Benzecri ont su rester à la postérité et servir dans toutes les SHS, notamment grâce à la mise en oeuvre des méthodes pour travailler sur des données qualitatives, il peut être utile de se rappeler qu’il en existe d’autres qui les ont précédées. C’est par exemple le cas de l’analyse factorielle exploratoire (AFE). Cette méthode, si elle est très utilisée en psychologie - discipline de Spearman, reste effectivement beaucoup plus rare dans les autres sciences humaines et sociales.

2 L’ AFE pour quoi faire

L’AFE vise à explorer la structure sous-jacente d’une base de donnée en identifiant des facteurs latents qui vont expliquer les relations entre les variables de notre base de données.

Qu’est ce qu’un facteur latent ? C’est une variable qui est <<<<<<< HEAD sous-jacente, car non observée ou mesurée directement. Ce facteur ======= sous-jacente, car non observée ou non mesurée directement. Ce facteur >>>>>>> master sous-jacent est postulé pour expliquer les covariances (ou corrélations) entre l’ensemble des variables observées et mesurées (celles de notre base de données). Les variables observées, sont mesurées directement, tandis que les facteurs latents ne le sont pas.

Cette notion de facteur latent est au coeur de l’analyse factorielle exploratoire. En effet l’idée centrale de cette méthode est que nos variables mesurées sont influencées par ces facteurs latents, et que ces facteurs vont expliquer la structure des relations des variables entre elles. Chaque facteur latent est associé à un groupe de variables qui partagent une variance commune. En d’autres termes, le facteur latent “capture” l’information partagée par un ensemble de variables. Supposons que nous avons une base de données constituée de variables mesurant un ensemble de critères observables. Par exemple, lors d’un match de rugby nous avons collecté le nombre de mètres parcourus, de points marqués, du nombre de passes, de plaquages… On pourrait postuler l’existence de facteurs latents qu’on pourrait appeler “performance” et “vision de jeu”. Ces deux facteurs latents ne peuvent pas être mesurés directement, mais peuvent être postulés pour tenter d’expliquer la variation commune <<<<<<< HEAD de nos variables observées/mesurées. Notre objectif lorsque l’on réalise une AFE sera d’identifier le nombre et la nature de ces facteurs latents et de comprendre comment ils sont associés et reliés aux variables mesurées.

Cette méthode est donc particulièrement intéressante et appropriée pour comprendre les dimensions sous-jacentes des données et les relations entre les variables. Elle va permettre de faire émerger un pattern de relations entre ces variables. C’est en cela qu’elle peut s’avérer particulièrement utile. Elle permet de rendre compte de phénomènes (les facteurs latents) que l’on suppose (par exemple la vision de jeu), mais qui sont trop complexes pour être mesurés directement.

Ainsi, si on cherche à explorer et à identifier des dimensions explicatives sous-jacentes, qui influencent nos variables, comme c’est souvent le cas en SHS, l’AFE s’avérera être un bon choix. Autre avantage important de l’analyse factorielle exploratoire, c’est qu’elle permet ensuite de réaliser une analyse factorielle confirmatoire, sur laquelle nous reviendrons plus tard dans cet article.

L’ACP est très utilisée dans l’ensemble des disciplines des SHS, quelque soit l’hypothèse testée. Ceci correspond davantage à des habitudes d’utilisation ou de certaines pratiques de la donnée, qu’à une réelle réflexion sur les méthodes de factorisation. Or, l’analyse en Composante Principale et l’Analyse Factorielle Exploratoire ne répondent pas aux mêmes besoins et aux mêmes hypothèses. L’AFE répond en réalité à des besoins et des manières de penser très courantes dans toutes les SHS, et dans certains cas devrait être privilégiée à l’ACP.

Par exemple, en géographie, l’AFE peut être utilisée pour comprendre les dimensions sous-jacentes des comportements humains et des phénomènes socio-spatiaux. Elle offre un moyen exploratoire et puissant d’analyser la structure des données géographiques, d’identifier des tendances spatiales, et d’améliorer la compréhension des relations entre les variables. Voici quelques exemples concrets où l’AFE peut s’avérer utile :

  • La réduction de la dimensionnalité. L’AFE reste une méthode d ’analyse factorielle, son objectif est donc une “simplification” ou synthèse de la donnée. Ainsi, l’AFE permet de réduire la dimensionnalité des données en identifiant des facteurs latents explicatifs de la variance partagée entre les variables. Cela facilite la simplification de l’analyse et la synthèse des informations.

  • L’identification de structures spatiales. L’AFE permet d’identifier des structures spatiales latentes ou des modèles sous-jacents dans les données géographiques. Par exemple, elle peut révéler des tendances ou des regroupements dans les caractéristiques géographiques qui ne sont pas évidents à partir d’une simple observation des données brutes.

  • L’Analyse des relations spatiales. L’AFE peut être utilisée pour explorer les relations entre différentes variables géographiques. Par exemple, elle peut aider à identifier des facteurs qui expliquent la covariance spatiale entre des indicateurs socio-économiques, environnementaux ou démographiques. Elle est ainsi pertinente pour identifier des facteurs qui influencent la distribution spatiale des phénomènes.

  • La modélisation du spatial. L’AFE peut être utilisée comme une étape préliminaire pour la modélisation spatiale. Elle met en lumière les variables les plus influentes dans un modèle et simplifie la modélisation en réduisant le nombre de variables.

  • La validation des mesures. Il est parfois nécesaire de mesurer des concepts complexes comme la qualité de vie, le développement régional, etc. L’AFE peut être employée afin de valider les mesures en identifiant les facteurs latents qui contribuent à ces concepts et en évaluant la cohérence des mesures.

2.1 ACP et AFE et quelles ======= de nos variables observées/mesurées.

Notre objectif lorsque l’on réalise une AFE sera d’identifier le nombre et la nature de ces facteurs latents et de comprendre comment ils sont associés et reliés aux variables mesurées. Cette méthode va donc permettre de faire émerger un pattern de relations entre ces variables. La structuration des facteurs obtenus ne sera peut-être pas exactement celle envisagée au départ, mais l’AFE, bien que mentionnée comme exploratoire, nécessite d’avoir des hypothèses concernant l’existance des facteurs latents précisément testés.

Ainsi, si on cherche à explorer et à identifier des dimensions explicatives sous-jacentes, qui influencent nos variables, comme c’est souvent le cas en SHS, l’AFE s’avérera être un bon choix. Autre avantage important de l’analyse factorielle exploratoire, c’est qu’elle peut être associée à une analyse factorielle confirmatoire afin d’étayer les résultats obtenus. Nous reviendrons plus tard dans cet article sur l’analyse factorielle confirmatoire.

2.1 ACP et AFE : quelles >>>>>>> master différences ?

En réalité, les différences entre ces deux méthodes sont importantes, bien que pas si simple à appréhender intuitivement. Ces deux méthodes vont différer tant dans leur objectif que dans leur approche. Ainsi, voici trois points principaux où ces méthodes divergent et qu’il est nécessaire de prendre en compte pour faire un choix éclairé entre analyse en composantes principale et analyse factorielle exploratoire : l’objectif principal, la nature des variables et l’interprétation des résultats.

1- L’objectif principal :

ACP et AFE ont comme objectif commun la réduction de l’information, mais elles ne vont pas du tout opérer de la même manière.

  • l’ACP : l’objectif est de réduire la dimensionnalité des données en utilisant les composantes principales. L’ACP va transformer les variables observées en un ensemble de variables non corrélées, que l’on appelle composantes principales. Dans l’ACP nous n’allons pas rechercher des facteurs latents. La composante principale est une combinaison linéaire des variables originales qui capture le plus possible de variance présente dans les données. Ces composantes principales sont classées par ordre décroissant de l’importance de la variance qu’elles capturent. Tout l’enjeu de l’ACP est de définir des composantes principales qui permettent de réduire la dimensionnalité des données tout en conservant l’information essentielle contenue dans les variables d’origine. Les composantes principales étant des variables non corrélées entre elles, cela simplifie l’interprétation des relations entre les observations. Pour résumer, l’objectif principal de l’ACP est de synthétiser nos données en composantes principales en tentant de conserver le maximum de variance des variables de notre base de données.
  • L’AFE : vise à explorer la structure sous-jacente des données en identifiant des facteurs latents qui expliquent les relations entre les variables observées. L’objectif est de réduire la dimensionnalité des données en se centrant sur la variance partagée entre les variables et non sur l’ensemble des données. Dans le cadre de l’AFE, une partie de la variance des données ne sera pas retenue dans le modèle. L’objectif n’étant pas de conserver le maximum de variance de notre jeu de données, mais bien de se centrer sur la variance partagée entre les différentes variables.

2- La nature des variables :

  • L’ACP : Les variables de notre base de données sont plutôt considérées comme des mesures directes. On cherche à réduire la dimensionnalité sans nécessairement interpréter les composantes principales en tant que telles.
  • L’AFE : Les variables sont considérées comme des indicateurs de facteurs latents. On souhaite comprendre la structure sous-jacente de notre base de données.

3- Interprétabilité :

  • L’ACP : Les composantes principales sont des combinaisons linéaires des variables originales et peuvent être peu interprétables du point de vue conceptuel. On va considérer le poids ou la contribution d’une variable pour chaque composante principale, ce qui va permettre de mesurer l’importance relative des variables dans la variance totale de nos données.
  • L’AFE : Les facteurs latents identifiés sont souvent interprétables comme des concepts sous-jacents aux données, mais qu’il est nécessaire d’identifier et de théoriser. Pour l’interprétation, nous allons étudier les charges factorielles associées à chaque facteur latent. Il s’agit tout simplement des corrélations de chaque variable avec chaque facteur latent. Ces corrélations nous permettent d’étudier la relation entre les variables et les facteurs latents, et donc de donner du sens à ces facteurs alors identifiés. L’analyse factorielle exploratoire repose sur la comparaison entre la matrice de corrélation initiale (sans la grille de lecture obtenue suite à l’identification des facteurs latents) et la matrice de corrélation obtenue suite à l’identification des facteurs. Si la différence entre ces deux matrices est faible, alors l’analyse factorielle exploratoire obtenue est considérée comme bonne et les facteurs latents identifiés permettent bien de réduire l’information proposée. Sinon la structure factorielle des données est à repenser.

Le choix de ces deux méthodes repose globalement sur ce que l’on veut étudier et de ce que l’on veut faire de la variance. Si on considère qu’il n’y a pas de facteur latent et que l’on souhaite conserver le maximum de la variance de nos données alors l’ACP est un choix tout à fait pertinent. En revanche, si on envisage une structure sous-jacente à <<<<<<< HEAD nos données et donc la présence de facteurs latents et que l’on estime ======= nos données, et donc la présence de facteurs latents, et que l’on estime >>>>>>> master qu’il n’est pas forcément nécessaire de conserver toute la variance de nos données, mais uniquement celle qui est partagée entre nos variables, alors l’AFE sera le bon choix.

2.2 Limites de l’AFE

Comme toutes les méthodes d’analyse de données l’AFE comporte des <<<<<<< HEAD limites. La limite majeure de l’AFE, c’est que cette méthode est plus efficiente avec des variables continues. Il est tout-à-fait possible de l’utiliser avec des variables ordonnées : catégories qui suivent un ordre, (par ex. de 1. “Pas du tout d’accord” à 5. “Tout-à-fait d’accord”) en traduisant chaque catégorie par un score. On peut également réaliser ce type d’analyse avec des variables catégorielles (catégories sans échelle de valeur entre elles par ex. : profession), mais il faudra alors être beaucoup plus prudent sur l’interprétation. Et selon les cas, il peut être plus pertinent d’utiliser une autre méthode de factorisation comme l’analyse factorielle des correspondances (AFC) ou une analyse des correspondances multiples (ACM).

======= limites.

Le type de variable

La limite majeure de l’AFE, repose sur le fait que cette méthode est plus efficiente avec des variables continues. Toutefois, il est tout-à-fait possible de l’utiliser avec des variables ordonnées : catégories qui suivent un ordre, (par ex. de 1. “Pas du tout d’accord” à 5. “Tout-à-fait d’accord”) en traduisant chaque catégorie par un score. On peut également réaliser ce type d’analyse avec des variables catégorielles (catégories sans échelle de valeur entre elles par ex. : profession), mais il faudra alors être beaucoup plus prudent sur l’interprétation. Et selon les cas, il peut être plus pertinent d’utiliser une autre méthode de factorisation comme l’analyse factorielle des correspondances (AFC) ou une analyse des correspondances multiples (ACM).

La taille de l’échantillon

>>>>>>> master

La taille de l’échantillon est également un élément contraignant pour ce type d’analyse. Si l’échantillon est trop faible au regard de la taille des informations à synthétiser, les résultats obtenus risquent de surreprésenter les spécifictés de la population alors testée. La structure de l’analyse ne sera pas généralisable, mais influencée par les spécificités de l’échantillon. Il est donc important d’avoir une taille d’échantillon suffisamment importante afin de pallier ce type de <<<<<<< HEAD biais (Young and Pearce 2013).

======= biais (Young and Pearce 2013). L’échantillon devra être sélectionné selon le nombre de variables contenues dans l’analyse et la force du lien entre les variables mesurées et les facteurs latents (Watkins, M. W., 2018). Plus ce lien sera fort, moins il sera nécessaire d’avoir un échantillon conséquent. Certains auteurs indiquent que si les corrélations entre les variables manifestes et les facteurs latents sont inférieures ou égales à 0.80, 150 observations peuvent suffire à réaliser l’analyse factorielle exploratoire. En revanche, si ces mêmes corrélations sont inférieures à 0.40 il serait alors nécessaire d’avoir un échantillon d’au-moins 300 observations pour retrouver une structure factorielle stable (Schreiber, J., 2021)

La force des liens

>>>>>>> master

Des corrélations trop fortes ou trop faibles entre les variables peuvent mettre en péril la mise en facteur des informations, mais pas pour les mêmes raisons. Si le set de variables soumis à la factorisation n’est pas du tout corrélé, alors les éléments présentés ne partagent pas d’éléments communs et ne peuvent pas être résumés sous un même facteur. L’hétérogénéité des informations peut tout-à-fait empêcher son résumé statistique via l’utilisation des analyses factorielles. Il n’est pas possible de réaliser des analyses factorielles sur des ensembles de variables non-corrélées. A l’inverse, si les variables retenues pour l’analyse sont trop fortement corrélées alors ceci sous-tend qu’elles contiennent des informations tellement similaires qu’elles en sont <<<<<<< HEAD redondantes. Cette redondance peut tout-à-fait biaiser la factorisation des informations, car certains éléments seront surreprésentés - sans que ======= redondantes. Cette redondance peut biaiser la factorisation des informations, car certains éléments seront surreprésentés - sans que >>>>>>> master cela ne reflète une quelconque réalité - par rapport à d’autres. Ce problème peut être résolu en sélectionnant uniquement l’une des deux variables représentatives d’un même phénomène. Par exemple, la catégorie socio-professionnelle et le niveau de diplôme sont généralement très corrélés, il faudra sélectionner l’une de ces deux variables dans le modèle d’analyse factorielle pour que celui-ci soit optimal (Tabachnick, B., & Fidell, L., 2014).

<<<<<<< HEAD =======

L’interprétation

>>>>>>> master

La subjectivité de l’interprétation peut aussi être une limite, notamment sur l’identification et l’interprétation des facteurs latents, qui dépendra beaucoup du chercheur et de son positionnement théorique.

<<<<<<< HEAD =======

2.3 L’AFE aujourd’hui en sciences humaines

En SHS aujourd’hui l’AFE est surtout utilisée en psychologie, et ce depuis de nombreuses années. La validation des tests psychométriques constitue un exemple classique de l’utilisation de l’AFE et de son utilisation conjointe avec l’Analyse factorielle confirmatoire (AFC). Afin de réaliser des tests standardisés pour évaluer des processus psychologiques, les psychologues ont recours à ce couple d’analyses factorielles, en réalisant une analyse factorielle exploratoire sur un premier échantillon et une analyse factorielle confirmatoire sur un second échantillon (ayant tous 2 les mêmes caractéristiques).

Les psychologues se sont tournés vers ces techniques de réduction des dimensions car, pour la plupart de leurs études, ils souhaitent se centrer sur la variance partagée entre chaque item, plutôt que de chercher à conserver la variance totale d’un ensemble de variables. Le processus méthodologique alors suivi permet de faire émerger une structure factorielle sans nécessairement la totalité des variables présentes. Cette structure factorielle permet d’observer comment les variables du jeu de données rendent compte des facteurs latents qui les sous-tendent. L’objectif finalement est de savoir “Est-ce que je mesure bien ce que je pense mesurer ?”. En d’autres termes, est-ce que les questions posées aux répondants sont adaptées pour accéder à une dimension latente non appréhendable directement.

Un point important nous semble à présent à souligner, sur l’utilisation des analyses factorielles exploratoires et confirmatoires. A partir du moment où un test psychométrique est validé, c’est-à-dire qu’il a déjà été éprouvé par le couple AFE/AFC sur un jeu de données assez conséquent, avec une population ayant les mêmes caractéristiques, il n’est pas nécessaire de remettre en cause la structure du test et nous pouvons directement procéder à une analyse factorielle confirmatoire, afin de vérifier si le modèle alors pré-établi par d’autres, s’ajuste à nos données. Ceci est conseillé afin de ne pas multiplier les tests statistiques et entraîner une inflation des résultats faussements positifs (encore appelés erreur de type II).

Cette approche statistique, peut tout-à-fait être appliquée aux autres disciplines des SHS, à la fois sur l’exploration des bases de données (AFE), ou sur une validation de modèle, ou encore une comparaison dans le temps (couple AFE/AFC). Nous verrons dans cet article comment adapter ce processus statistique à des données non psychologiques.

>>>>>>> master

3 Les packages

if (!require("pacman")) install.packages("pacman")
<<<<<<< HEAD
pacman::p_load(correlation, corrplot, dplyr, EFA.dimensions, ggraph, ggplot2, lavaan, nFactors, parallel, parameters, psych, RColorBrewer, rrcov, see, table1, usdm)
======= pacman::p_load(correlation, corrplot, dplyr, EFA.dimensions, effectsize, ggraph, ggplot2, here, lavaan, nFactors, parallel, parameters, psych, RColorBrewer, see, SemPlot, SemTools, table1, usdm)
>>>>>>> master

A quoi servent ces différents packages ? :

  • pacman : est un package de management de packages.

  • here <<<<<<< HEAD : permet de gérer les chemin d’accès au ein de notre projet

  • ======= : permet de gérer les chemin d’accès au sein de notre projet

    >>>>>>> master
  • les packages correlation et corrplot permettent de réaliser des corrélations et des graphiques tels que des corrélogrammes.

  • dplyr est un package de manipulation de données.

  • Les packages EFA.dimensions, nfactors, psych et parallel sont des packages utilisés pour vérifier si les données sont factorisables grâce à différents indices statistiques (KMO, etc.). Ils permettent également de déterminer le nombre de facteurs optimal à retenir selon le set de données soumis à l’analyse.

  • ggraph, ggplot2, RColorBrewer et see sont des packages dédiés à la production de représentations graphiques.

  • Le package lavaan permet de réaliser des modèles statistiques impliquant des variables latentes, telles qu’elles existent dans les Analyses factorielles exploratoires et confirmatoires.

  • Les packages parameters, et table1 sont utilisés dans cette fiche pour réaliser des statistiques descriptives et des mises en forme de sortie exploitables directement.

  • <<<<<<< HEAD
  • Le package rrcov permet de détecter les multioutliers d’un jeu de données en se basant sur la méthode MCD.

  • ======= >>>>>>> master
  • Le package usdm comprend différentes fonction permettant d’explorer l’impact de différentes sources d’incertitudes dans des mesures d’association. Nous utiliserons surtout les fonctions permettant de mesurer la multicolinéarité entre des variables.

  • Le package effectsize pour interpréter les coefficients de l’analyse factorielle confirmatoire

  • Les packages semPlot et semTools pour réaliser des equations structurelles méthode à laquelle appartient l’analyse factorielle confirmatoire

4 Les données

L’idée de cet article est de présenter l’analyse factorielle exploratoire et de voir comment elle peut constituer une alternative à <<<<<<< HEAD l’analyse en composante principale. L’AFE est très utilisée en psychologie, mais beaucoup moins dans d’autres disciplines des SHS. Pour illustrer l’intérêt de ces méthodes en dehors de la psychologie, dans un premier temps nous utiliserons des données issues de travaux en géographie et dans un deuxième temps de données démographiques. Ces dernières portent sur l’ensemble des pays du monde et sont publiées dans le cadre du bulletin d’information scientifique “Population et Société” produit par l’INED. Dans les deux cas la dimension spatiale de ces données ne sera pas exploitée, ce n’est pas l’objectif des analyses factorielles. Dans un troisième temps, une analyse factorielle exploratoire sera réalisée sur des données provenant de recherches en Psychologie.

======= l’analyse en composante principale. Pour illustrer l’intérêt de ces méthodes en dehors de la psychologie, nous utiliserons des données issues de travaux en géographie. Ces dernières portent sur le prix de l’immobilier. La dimension spatiale de ces données ne sera pas exploitée, ce n’est pas l’objectif des analyses factorielles.

>>>>>>> master



Télécharger les données


5 Mise en pratique : exemple du prix de l’immobilier en France hexagonale

Les données du prix de l’immobilier par EPCI (prix médian au m²) sont issues des ventes observées sur l’année 2018, extraites depuis la base de données des notaires de France par Frédéric Audard et Alice Ferrari. Ce fichier a été simplifié pour ne conserver que les variables d’intérêts parmi une cinquantaine Les données statistiques proviennent de l’INSEE (année 2019) : 9 variables ont été choisies pour leur potentialité à expliquer les variations des prix de l’immobilier, concernant la population, le logement et les revenus et niveaux de vie.

Ce fichier est composé des 9 variables suivantes :

  • prix_med : prix médian par EPCI à la vente au m²
  • perc_log_vac : % logements vacants
  • perc_maison : % maisons
  • perc_tiny_log : % petits logements
  • dens_pop : densité de population
  • med_niveau_vis : médiane du niveau de vie
  • part_log_suroccup : % logements suroccupés
  • part_agri_nb_emploi : % agriculteurs
  • part_cadre_profintellec_nbemploi : % cadres et professions intellectuelles
# Chargement des données de base

library(here)
csv_path <- here("data", "immo_afe.csv")

immo <- read.csv2(csv_path, row.names=1)


### Centrer et réduire les variables
dfz <-  data.frame(scale(immo, center=T, scale=T))

Il est extrêmement recommandé de centrer-réduire ses données pour réaliser une analyse statistique telle qu’une analyse factorielle, ou plus généralement lorsque l’on travaille avec des variables n’étant pas sur les mêmes échelles, sur les mêmes ordres de grandeurs. Cela implique de faire subir à nos données une transformation statistique visant à ce qu’elles aient une moyenne de 0 et un écart-type de 1. On parle aussi en statistique de standardisation. Cette transformation permet de conserver la variabilité de nos données (la distance entre chaque valeur reste inchangée), tout en les rendant comparables (elles sont placées sur une même échelle). Dans le cadre de modélisations statistiques, il est nécessaire de réaliser cette opération sur les variables explicatives du modèle. Sur R on peut facilement réaliser cette opération avec la fonction scale() - que nous utilisons dans notre exemple - ou à “la main”. L’opération est simple : on soustrait chaque valeur par la moyenne puis on divise chaque valeur par l’écart-type.

<<<<<<< HEAD

La première étape étant toujours la description des données, voici un tableau récapitulatif de nos variables :

table1(~ prix_med + perc_log_vac + perc_maison + perc_tiny_log + dens_pop + med_niveau_vis + part_log_suroccup + part_agri_nb_emploi + part_cadre_profintellec_nbemploi , data=immo) 
Overall
(N=1223)
prix_med
Mean (SD) 0.0000000000000000969 (1.00)
Median [Min, Max] -0.265 [-1.43, 11.2]
perc_log_vac
Mean (SD) 0.00618 (0.996)
Median [Min, Max] -0.0678 [-2.75, 3.33]
perc_maison
Mean (SD) -0.00247 (1.00)
Median [Min, Max] 0.300 [-3.73, 1.17]
perc_tiny_log
Mean (SD) 0.00269 (1.00)
Median [Min, Max] -0.287 [-1.31, 6.44]
dens_pop
Mean (SD) 0.0000355 (1.00)
Median [Min, Max] -0.236 [-0.386, 22.8]
med_niveau_vis
Mean (SD) -0.00147 (1.00)
Median [Min, Max] -0.202 [-2.10, 6.95]
part_log_suroccup
Mean (SD) -0.000331 (1.00)
Median [Min, Max] -0.303 [-1.23, 7.35]
part_agri_nb_emploi
Mean (SD) 0.000627 (1.00)
Median [Min, Max] -0.264 [-1.07, 5.68]
part_cadre_profintellec_nbemploi
Mean (SD) 0.00189 (1.00)
Median [Min, Max] -0.157 [-1.91, 7.50]

La réalisation des représentations graphiques permet d’appréhender les distributions de nos variables et leurs éventuelles spécificités.

dfgraph<-subset(immo, select = c(prix_med, perc_log_vac, perc_maison, perc_tiny_log, dens_pop, med_niveau_vis, part_log_suroccup, part_agri_nb_emploi, part_cadre_profintellec_nbemploi))

par( mfrow= c(3,3) )
=======

La première étape étant toujours la description des données, voici le code pour réaliser un tableau récapitulatif de nos variables :

table1(~ prix_med + perc_log_vac + perc_maison + perc_tiny_log + dens_pop + med_niveau_vis + part_log_suroccup + part_agri_nb_emploi + part_cadre_profintellec_nbemploi , data=immo) 

La réalisation des représentations graphiques permet d’appréhender les distributions de nos variables et leurs éventuelles spécificités. Voici une façon de réaliser un diagramme des distributions de nos variables.

dfgraph<-subset(immo, select = c(prix_med, perc_log_vac, perc_maison, perc_tiny_log, dens_pop, med_niveau_vis, part_log_suroccup, part_agri_nb_emploi, part_cadre_profintellec_nbemploi))

par(mfrow = c(3,3))
>>>>>>> master

h1 <- hist(dfgraph$prix_med, main=NULL)
h2 <- hist(dfgraph$perc_log_vac, main=NULL)
h3 <- hist(dfgraph$perc_maison, main=NULL)
h4 <- hist(dfgraph$perc_tiny_log, main=NULL)
h5 <- hist(dfgraph$dens_pop, main=NULL)
h6 <- hist(dfgraph$med_niveau_vis, main=NULL)
h7 <- hist(dfgraph$part_log_suroccup, main=NULL)
h8 <- hist(dfgraph$part_agri_nb_emploi, main=NULL)
h9 <- hist(dfgraph$part_cadre_profintellec_nbemploi, main=NULL)
<<<<<<< HEAD

=======

par(mfrow = c(1,1))
>>>>>>> master

5.1 Les pré-requis de l’analyse factorielle

Comme toutes les méthodes statistiques les analyses factorielles ont un certain nombre de pré-requis à vérifier. Ne pas en tenir compte nous expose à des résultats biaisés voire complètement erronés.

5.1.1 Les Outliers : comment les gérer ?

La question du traitement de ces individus extrêmes est loin d’être simple. Elle doit faire l’objet d’une réflexion et de choix importants qu’il faut pouvoir assumer tant statistiquement que théoriquement.

Les outliers sont nos individus extrêmes. Il est toujours nécessaire de pouvoir les identifier afin de savoir comment les gérer. L’enjeu autour de ces individus c’est qu’ils vont nécessairement influencer (voire fausser) les résultats de nos analyses. L’analyse obtenue sera différente si on fait le choix de les supprimer ou de les conserver (Zijlstra et al. 2011).

<<<<<<< HEAD

5.1.1.1 La méthode MCD :

Il existe un grand nombre d’indicateurs et de distances différentes qui permettent d’identifier des outliers. Afin de choisir la bonne méthode, il est important de se rappeler dans quel contexte nous nous trouvons et quelle analyse nous souhaitons réaliser.

Dans le cadre des analyses multivariées, au sein duquel nous nous trouvons avec les différentes analyses factorielles, il est nécessaire de rechercher les multioutliers. Ce sont des valeurs extrêmes sur l’ensemble des variables de notre échantillon de variables. Certains individus peuvent ne pas avoir de caractéristiques extrêmes lorsque celles-ci sont étudiées séparément, mais se révéler être très différents du reste de l’échantillon sur un pattern de variables. Dans le cadre des analyses multivariées, il est essentiel de s’assurer que de telles particularités ne viennent pas perturber la qualité des résultats obtenus. Ne pas retirer les valeurs extrêmes expose à centrer l’analyse des résultats sur la distance entre cette valeur très différente du reste de l’échantillon et les autres valeurs. Ceci donc au détriment des variabilités qui pourraient être contenues dans le reste de l’échantillon. Ces variabilités seront donc écrasées, et paraitront donc bien minimes face à la distance émise par la ou les valeurs extrêmes.

Il existe de nombreuses méthodes pour identier ces individus extrêmes. Une méthode robuste qui fait consensus dans le cadre de données multidimensionnelles (c’est à dire corrélées entre elles) est la méthode MCD. Elle a été théorisé par Christophe Leys et ses collaborateurs en 2018 (Leys et al. 2018). Cette distance est elle même basée en partie sur la distance de Mahalanobis, et sa variante, la Mahalanobis robuste, qui ont été développées respectivement par Prasanta Chandra Mahalanobis en 1936 (Mahalanobis, C., P, 1936) et Gnanadesikan & Kettenring en 1972 (Gnanadesikan, R. & Kettenring, J. R., 1972).

La distance de Mahalanobis se base sur la moyenne et la covariance de tous les individus de notre base de données y compris les outliers. Cette distance est donc elle même très influencée par nos individus extrêmes. Cela pose donc une question sur la réelle identification des outliers. Leys et al. proposent donc une nouvelle méthode qui repose sur le calcul des paramètres du sous-ensemble de notre base de données qui a été défini comme étant le plus central. Ce sous-ensemble est issu d’une itération permettant de déterminer quel sous-ensemble peut être considéré comme le plus central.

5.1.1.2 Identification des Outliers avec la méthode MCD :

Pour utiliser cette méthode il existe plusieurs packages comme notamment performance, robustbase ou encore rrcov. Ces trois packages sont sur le cran et permettent de calculer efficacement la distance entre nos données avec la méthode MCD. Avant de débuter le calcul il est très important de savoir qu’une des limites majeures de cette méthode est qu’elle ne peut pas gérér les valeurs manquantes dans nos bases de données. Elle ne fonctionne que sur des données complètes, il faudra donc imputer les données manquantes ou les supprimer en amont. La fonction CovMcd du package rrcov peut tourner avec des données manquantes, elle les gère en les supprimant. Nous faisons le choix de présenter cette méthode dans un premier temps notamment pour ses sorties graphiques qui peuvent s’avérer être des aides efficaces à l’identification des outliers.

#MCD avec le package rrcov
library(rrcov)
# 1- calcul de la distance MCD
mcd_result <- CovMcd(dfz, alpha=0.75)
# L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
# 2- visualisation des outliers
plot(mcd_result, which="all")

1- Distance-Distance plot : Diagrame de distance entre la méthode MCD et la distance de Mahalanobis

2- Distance plot : Diagramme de Distance de la méthode MCD

3- X² QQ-Plot : diagramme Quantile-Quantile qui permet d’évaluer la pertinence de l’ajustement d’une distribution donnée à un modèle théorique. Ici l’ajustemet de la méthode MCD à la distribution théorique du X².

4- Scree plot : comparaison des valeures propres entre la méthode robuste et classique.

Le package performance permet également d’identifier directement les outliers ainsi que de synthétiser l’information dans un data frame. Ceci peut s’avérer très utile pour manipuler les données, par exemple isoler facilement les outliers et les travailler spécifiquement. En revanche, les visualisations issues de performance ne sont pas très lisibles quand il y a de nombreux outliers.

# MCD avec le package performance

library(performance)
# 1- calcul de la méthoe MCD
out<-check_outliers(dfz, method = "mcd", thresold = 0.75)
#2- Affichage des résultats
out
275 outliers detected: cases 1, 8, 19, 22, 25, 27, 30, 31, 32, 34, 36,
  37, 46, 47, 52, 62, 63, 66, 67, 74, 75, 77, 81, 82, 90, 98, 116, 118,
  129, 142, 143, 145, 146, 147, 173, 177, 178, 180, 192, 214, 219, 225,
  232, 243, 247, 260, 261, 266, 267, 269, 271, 272, 273, 274, 276, 277,
  278, 279, 280, 283, 285, 287, 288, 292, 293, 298, 303, 313, 314, 338,
  343, 350, 353, 357, 367, 371, 382, 383, 389, 390, 400, 418, 423, 426,
  429, 446, 447, 450, 471, 473, 475, 480, 482, 483, 491, 507, 526, 549,
  555, 569, 578, 581, 584, 604, 645, 651, 654, 665, 666, 669, 671, 674,
  690, 692, 694, 695, 702, 709, 715, 717, 718, 723, 737, 738, 739, 740,
  741, 758, 765, 768, 769, 770, 771, 774, 782, 795, 796, 797, 798, 799,
  800, 801, 803, 816, 817, 818, 819, 821, 825, 833, 850, 853, 854, 856,
  858, 861, 862, 871, 872, 874, 878, 880, 884, 888, 889, 891, 893, 896,
  897, 898, 908, 918, 920, 921, 922, 924, 927, 929, 933, 934, 941, 942,
  943, 952, 961, 968, 969, 970, 974, 985, 987, 1000, 1002, 1003, 1015,
  1016, 1017, 1019, 1021, 1022, 1024, 1026, 1028, 1029, 1031, 1032, 1033,
  1034, 1040, 1050, 1051, 1053, 1056, 1057, 1059, 1060, 1062, 1063, 1065,
  1069, 1070, 1072, 1080, 1083, 1091, 1092, 1094, 1096, 1097, 1098, 1117,
  1123, 1124, 1126, 1127, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138,
  1139, 1140, 1147, 1149, 1151, 1153, 1154, 1155, 1156, 1159, 1160, 1163,
  1168, 1173, 1175, 1176, 1178, 1183, 1185, 1186, 1188, 1202, 1207, 1214,
  1215, 1216, 1217, 1219, 1220, 1221, 1222, 1223.
- Based on the following method and threshold: mcd (30).
- For variables: prix_med, perc_log_vac, perc_maison, perc_tiny_log,
  dens_pop, med_niveau_vis, part_log_suroccup, part_agri_nb_emploi,
  part_cadre_profintellec_nbemploi.
# 4- Mise en data frame
outliers_info <- as.data.frame(out)

head(outliers_info)
  Row Distance_MCD Outlier_MCD Outlier
1   1    28.600638           1       1
2   2     4.498179           0       0
3   3    18.643357           0       0
4   4    18.049748           0       0
5   5     6.770191           0       0
6   6     4.987402           0       0
# row : l'identifiant de la ligne correspondant dans le dataframe immo.
# Distance_MCD : la distance calculée selon la méthode MCD, plus elle est importante plus l'individu est extrême
# Outlier_MCD : probalité que l'individu soit un outlier selon la méthode MCD.1 l'individu est un outlier, 0 ce n'est pas le cas.
# Outlier : l'individu est-il un outlier. 1 oui et 0 non

# Pour éventuelement avoir tous nos outliers
filtered_data <- dfz[outliers_info$Outlier_MCD >0, ]

dfz$Row <- seq_len(nrow(dfz))
dfz$name<- rownames(dfz)

data <- merge(dfz, outliers_info, by = "Row")

dfz$Row <- NULL
dfz$name <- NULL

# Exemple de visualisation avec ggplot

# ind_outlier <- filter(outliers_info, outliers_info$Outlier_MCD == 1)

  #ggplot(ind_outlier)+
  #    geom_bar(aes(x=reorder(Row, Distance_MCD), y=Distance_MCD),fill = "#112446", stat = "identity") +
  #    coord_flip() + theme_minimal()

Nous avons donc ainsi calculé pour chaque ligne sa distance selon la méthode MCD. On note dans notre cas qu’un individu se détache particulièrement. Il s’agit de l’EPCI de la ligne 266 avec l’identifiant 200054781.

Cette étape d’identification est essentielle car lourde de conséquences.

Que faire des outliers ? Les conserver en prenant le risque qu’ils biaisent nos résultats ou les retirer mais en perdant le sens de notre analyse ?

Par exemple, dans notre cas, cet individu de la ligne 266 correspond au grand Paris. Il devient beaucoup plus aisé de comprendre pourquoi cet individu est aussi particulier (nous rappelons qu’il y a le prix de l’immobilier au m² dans nos variables), mais aussi des enjeux de le supprimer ou non de notre analyse. Le supprimer c’est retirer le grand Paris de note analyse des prix de l’immobilier en France hexagonale.

=======

Il existe un grand nombre d’indicateurs et de distances différentes qui permettent d’identifier des outliers. Nous ne les présenterons pas dans le cadre de cet article. Il existe différents travaux sur le sujet pouvant vous éclairer, dont voici un aperçu (Aguinis et al. 2013 ; Bakker, M., & Wicherts, J. M., 2014 ; Leys et al. 2018 ; Leys et al. 2019, etc.).

Nous avons sorti les outliers de notre base de données. Petite précision, dans notre exemple une seule observation était considérée comme extrême, il s’agissait de l’individu de la ligne 266 correspondant au grand Paris. Il devient beaucoup plus aisé de comprendre pourquoi cet individu est aussi particulier (nous rappelons qu’il y a le prix de l’immobilier au m² dans nos variables), mais aussi des enjeux de le supprimer ou non de notre analyse. En effet, le supprimer c’est retirer le grand Paris de notre analyse des prix de l’immobilier en France hexagonale, avec les conséquences théorique que cela peut impliquer.

>>>>>>> master

Pour cet article nous faisons le choix de le supprimer de notre analyse. Nous cherchons à mettre en évidence les facteurs latents, s’exprimant par nos variables mesurées, qui caractérisent les EPCI de la France Hexagonale. Or malheureusement si nous conservons le grand Paris nous nous exposons à ne pas observer la variabilité des différentes EPCI de l’haxagone, mais uniquement de la distance entre le grand Paris et les autres EPCI de notre base de données. En effet, le grand Paris étant tellement éloigné des autres EPCI sur l’ensemble des variables de notre base de données que celui-ci écrase les variabilités entre les autres communes. Afin de pouvoir faire émerger une structure factorielle qui ait du sens entre nos EPCI, nous faisons le choix de sortir le grand Paris de notre base de données.

Nous supprimons donc le grand Paris de notre base de données :

dfzp <- dfz[!(row.names(dfz) %in% c("200054781")), ]

A présent, vérifions si d’autres multioutliers se détachent au sein de notre base de donnée. En théorie, il faut répéter cette opération plusieurs fois, jusqu’à ce que l’on observe une homogénéité des données et une abscence de valeurs extrêmes.

#MCD avec le package rrcov
library(rrcov)
# 1- calcul de la distance MCD
mcd_resultp <- CovMcd(dfzp)
# L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
# 2- visualisation des outliers
plot(mcd_resultp, which="all")

Contrairement à l’exemple précédent, avec la présence du Grand Paris, les représentations graphiques indiquent que si des valeurs se détachent et pourraient tout-à-fait être considérées comme extrêmes, elles restent proches du reste de l’ensemble de données. La distance n’est donc pas aussi importante entre les EPCI qu’avec la présence du Grand Paris. Il faudra conserver cette information lors de l’analyse des résultats qui seront donc à interpréter avec précaution.

Vérifions si les distributions de nos variables ont été impactées par cette suppression.

par( mfrow= c(3,3) )

h1_1 <- hist(dfzp$prix_med, main=NULL)
h2_1 <- hist(dfzp$perc_log_vac, main=NULL)
h3_1 <- hist(dfzp$perc_maison, main=NULL)
h4_1 <- hist(dfzp$perc_tiny_log, main=NULL)
h5_1 <- hist(dfzp$dens_pop, main=NULL)
h6_1 <- hist(dfzp$med_niveau_vis, main=NULL)
h7_1 <- hist(dfzp$part_log_suroccup, main=NULL)
h8_1 <- hist(dfzp$part_agri_nb_emploi, main=NULL)
h9_1 <- hist(dfzp$part_cadre_profintellec_nbemploi, main=NULL)

======= doit être questionnée. Elle n’est peut-être pas la plus adaptée pour traiter les données et répondre aux hypothèses alors formulées.

Vous pouvez charger les données propres dans le dossier data, le fichier s’apelle dfzp.csv. Voici à nouveau le lien de téléchargement ci-dessous.



Télécharger les données


# Chargement des données de base

library(here)
csv_path <- here("data", "dfzp.csv")

dfzp <- read.csv(csv_path, row.names=1)

Il faut désormais vérifier si les distributions de nos variables ont été impactées par cette suppression de nos outliers afin vérifier que les analyses envisagées sont toujours réalisables.

dfgraph2<-subset(dfzp, select = c(prix_med, perc_log_vac, perc_maison, perc_tiny_log, dens_pop, med_niveau_vis, part_log_suroccup, part_agri_nb_emploi, part_cadre_profintellec_nbemploi))

par(mfrow = c(3,3))

h1 <- hist(dfgraph2$prix_med, main=NULL)
h2 <- hist(dfgraph2$perc_log_vac, main=NULL)
h3 <- hist(dfgraph2$perc_maison, main=NULL)
h4 <- hist(dfgraph2$perc_tiny_log, main=NULL)
h5 <- hist(dfgraph2$dens_pop, main=NULL)
h6 <- hist(dfgraph2$med_niveau_vis, main=NULL)
h7 <- hist(dfgraph2$part_log_suroccup, main=NULL)
h8 <- hist(dfgraph2$part_agri_nb_emploi, main=NULL)
h9 <- hist(dfgraph2$part_cadre_profintellec_nbemploi, main=NULL)

par(mfrow = c(1,1))
>>>>>>> master

5.1.2 Analyse de la matrice de corrélation

L’analyse des corrélations est une étape toujours essentielle dans l’analyse de données, et notamment dans le cadre de la modélisation statistique.

Cette étape est fondamentale pour plusieurs raisons. D’abord car elle nous permet d’étudier les relations entre nos variables, ce qui va nous donner des indications sur le meilleur modèle pour nos données. En effet, des corrélations trop fortes ou à l’inverse une absence totale de corrélation peut poser de nombreux problèmes comme nous l’avons évoqué précédemment. Par exemple:

  • La multi-colinéarité : Lorsque des variables sont trop fortement corrélées (positivement ou négativement) cela pose un problème de multi-colinéarité. Les variables sont tellement liées qu’il devient difficile de distinguer leur impact individuel, cela va rendre les résultats peu fiables. Il deviendra compliqué d’interpréter les coefficients et de comprendre de quoi rend-il vraiment compte.
  • Des risques de surajustement : Un modèle avec des prédicteurs trop fortement corrélés va être surajusté et donc ne sera pas pertinent dans son rôle prédictif.
  • Une instabilité du modèle : Les modèles avec des variables trop fortement corrélées sont instables. La moindre variation dans les données pourra provoquer de très grandes variations dans les résultats.
  • Un modèle non optimisé : Un modèle doit respecter le principe de parcimonie. Il ne faut pas qu’il contienne de variables redondantes (corrélations trop fortes) ou inutiles (absence de corrélations).
  • Un modèle nul : Une absence totale de corrélations remet en question la pertinence de tester, dans un même modèle, des variables qui n’auraient donc aucun rapport entre elles.

Comme nous avons pu l’observer précédemment avec les histogrammes des distributions de nos variables, celles-ci ne suivent pas une loi normale. Le coeficient de corrélation de Pearson n’étant pas stable sur des données non-normales, nous lui préfererons celui de Spearman pour faire notre matrice.

<<<<<<< HEAD
# Matrice de corrélation
cor <- correlation(dfzp, method = "spearman")
cor %>%
  summary(redundant = FALSE)
=======
# Matrice de corrélation
cor <- correlation(dfzp, method = "spearman")
cor %>%
  summary(redundant = FALSE)
>>>>>>> master
# Correlation Matrix (spearman-method)

Parameter           | part_cadre_profintellec_nbemploi | part_agri_nb_emploi | part_log_suroccup | med_niveau_vis | dens_pop | perc_tiny_log | perc_maison | perc_log_vac
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
prix_med            |                          0.55*** |            -0.59*** |           0.45*** |        0.64*** |  0.61*** |       0.42*** |    -0.52*** |     -0.79***
perc_log_vac        |                         -0.34*** |             0.44*** |          -0.21*** |       -0.56*** | -0.46*** |      -0.14*** |     0.30*** |             
perc_maison         |                         -0.59*** |             0.70*** |          -0.75*** |       -0.24*** | -0.53*** |      -0.72*** |             |             
perc_tiny_log       |                          0.69*** |            -0.69*** |           0.80*** |        0.20*** |  0.65*** |               |             |             
dens_pop            |                          0.71*** |            -0.81*** |           0.45*** |        0.46*** |          |               |             |             
med_niveau_vis      |                          0.44*** |            -0.42*** |             0.07* |                |          |               |             |             
part_log_suroccup   |                          0.54*** |            -0.62*** |                   |                |          |               |             |             
part_agri_nb_emploi |                         -0.75*** |                     |                   |                |          |               |             |             

p-value adjustment method: Holm (1979)

La matrice obtenue indique que l’ensemble de nos variables sont corrélées. Nous ne sommes pas en présence d’une hétérogénéité d’informations. Nous pouvons donc rechercher une structure sous-jacente à cet ensemble de variables qui partagent une part de variance commune entre-elles et donc réaliser uen analyse factorielle.

Toutefois, on observe entre certaines variables des corrélations fortes, notamment entre la part de logement sur-occupés (part_log_suroccup) et le pourcentage de maisons (perc_maison) avec un coefficient de -0.75. Ou encore entre le pourcentage de logements sur-occupés et le pourcentage de petits logements (perc_tiny_log) avec un coefficient de corrélation de 0.80. La question à se poser est de savoir s’il est absolument nécessaire de conserserver toutes ces variables. Apportent-elles toutes une part d’information singulière ou est-on en présence de redondance d’information entre nos variables ? Bref leur co-présence dasn notre modèle n’est-elle pas source de biais?

Pour faire ce choix il faut appliquer le principe de parcimonie. Ce principe indique qu’entre deux choix qui expliquent de manière adéquate les observations, il faut tendre vers le modèle le plus simple et le moins complexe.

Ici nous faisons le choix de conserver toutes les variables, bien que très corrélées, nous estimons qu’elles ne renvoient pas à la même information et souhaitons les conserver dans notre modèle.

Vérifions tout de même si nous ne sommes pas en présence d’une multicolinéarité. C’est-à-dire que plusieurs variables partagent une part de variance importante, ce qui peut amener à sur-représenter un phénomène et biaiser les résultats lors d’une analyse factorielle exploratoire. Afin de vérifier la multicolinéarité entre nos variables nous utiliserons le VIF Variance Inflation Factor. Cet indice est habituellement utilisé pour des modèles de régressions, toutefois Kyriazos & Poga ont démontré son utilité dans le cadre des analyses factorielles (Kyriazos & Poga, 2023).

<<<<<<< HEAD
vifstep(dfzp, method = "spearman")
=======
vifstep(dfzp, method = "spearman")
>>>>>>> master
No variable from the 9 input variables has collinearity problem. 

The linear correlation coefficients ranges between: 
min correlation ( part_log_suroccup ~ med_niveau_vis ):  0.07115077 
max correlation ( part_agri_nb_emploi ~ dens_pop ):  -0.8051288 

---------- VIFs of the remained variables -------- 
                         Variables      VIF
1                         prix_med 4.593899
2                     perc_log_vac 2.263956
3                      perc_maison 3.297333
4                    perc_tiny_log 6.445563
5                         dens_pop 2.089354
6                   med_niveau_vis 2.137548
7                part_log_suroccup 6.894329
8              part_agri_nb_emploi 1.813606
9 part_cadre_profintellec_nbemploi 3.115692

Bien que la fonction ne nous signale aucun problème de multicolinéarité, nous observons toutefois 2 VIF supérieurs à 5. Celui sur la variable représentant la part des logements sur-occupés et celui sur le pourcentage de petits logements. Le seuil à retenir pour considérer la présence de multicolinéarité ou non à l’aide du VIF ne fait pas l’unanimité parmi les statisticiens. Dans notre exemple, nous nous basons sur la démonstration de Farrar & Glauber qui préconise un seuil de 5 (Farrar & Glauber, 1967). Nous choisissons donc de sortir la variable renseignant la part de logements sur-occupés. Après vérification sur ce nouveau set de variable, les VIF obtenus sont tous inférieurs à 5, nous pouvons conclure en faveur d’une absence de multicolinéarité entre nos 8 variables.

<<<<<<< HEAD
dfzpp<-subset(dfzp, select = -c(part_log_suroccup))
vifstep(dfzpp, method = "spearman")
=======
dfzpp<-subset(dfzp, select = -c(part_log_suroccup))
vifstep(dfzpp, method = "spearman")
>>>>>>> master
No variable from the 8 input variables has collinearity problem. 

The linear correlation coefficients ranges between: 
min correlation ( perc_tiny_log ~ perc_log_vac ):  -0.141792 
max correlation ( part_agri_nb_emploi ~ dens_pop ):  -0.8051288 

---------- VIFs of the remained variables -------- 
                         Variables      VIF
1                         prix_med 3.815959
2                     perc_log_vac 2.257504
3                      perc_maison 2.994347
4                    perc_tiny_log 3.996999
5                         dens_pop 2.024424
6                   med_niveau_vis 1.829559
7              part_agri_nb_emploi 1.760249
8 part_cadre_profintellec_nbemploi 3.115098
<<<<<<< HEAD

5.1.3 KMO et Sphéricité

Avant de factoriser nos données et de rechercher une structure sous-jacente, il est nécessaire de vérifier la présence d’un minimun de corrélation entre nos variables. Ce que nous avons fait précédemment. En effet, dans le cas où les corrélations sont très faibles ou inexistantes, il sera très difficile de faire émerger un ou des facteurs. L’AFE ne sera donc probablement pas l’analyse à conseiller.

Ensuite, il faut mesurer l’adéquation de l’échantillonnage. Cette mesure donne un aperçu global de la qualité des corrélations inter-items (inter-variables). Pour ce faire on va utiliser l’indice KMO. L’indice KMO varie entre 0 et 1 et donne une information complémentaire à l’examen de la matrice de corrélation. Cet indice est calculé pour l’ensemble de nos variables, mais aussi pour chaque variable. Un KMO élevé indique que les variables sont suffisamment corrélées pour justifier l’utilisation de l’AFE. En revanche, un KMO bas suggère que l’analyse factorielle pourrait ne pas être appropriée avec les données fournies.

L’interprétation du KMO a été décrite par Kaiser en 1974 et se décline ainsi (Kaiser, 1974) :

=======

5.1.3 Pré-requis à la factorisation : KMO et Bartlett

Avant de factoriser nos données et de rechercher une structure sous-jacente, il est nécessaire de vérifier la présence d’un minimun de corrélation entre nos variables. Ce que nous avons fait précédemment avec la matrice de corrélation. En effet, dans le cas où les corrélations sont très faibles ou inexistantes, il sera très difficile de faire émerger un ou des facteurs. L’AFE ne sera donc probablement pas l’analyse à conseiller.

5.1.3.1 Indice Kaiser-Meyer-Olkin (KMO)

Dans le cadre d’une anlyse factorielle il faut mesurer l’adéquation de l’échantillonnage. Cette mesure donne un aperçu global de la qualité des corrélations inter-items (inter-variables). Pour ce faire on va utiliser l’indice Kaiser-Meyer-Olkin ou plus simplement appelé KMO (Kaiser, H., F., 1974). L’indice KMO varie entre 0 et 1 et donne une information complémentaire à l’examen de la matrice de corrélation. Cet indice est calculé pour l’ensemble de nos variables, mais aussi pour chaque variable. Un KMO élevé indique que les variables sont suffisamment corrélées pour justifier l’utilisation de l’AFE (ou plus largement d’une méthode d’analyse factorielle). En revanche, un KMO bas suggère que l’analyse factorielle pourrait ne pas être appropriée avec les données fournies.

L’interprétation du KMO a été décrite par Kaiser en 1974 et se décline ainsi (Kaiser, H., F., 1974) :

>>>>>>> master
  • 0.90 et plus : Merveilleux
  • 0.80 et plus : Méritoire
  • 0.70 et plus : Bien
  • 0.60 et plus : Médiocre
  • 0.50 et plus : Misérable
  • Moins de 0.50 : Inacceptable

On peut tout-à-fait avoir le cas d’un KMO global élevé indiquant une bonne adéquation générale, mais un KMO d’une variable en particulier très mauvais. Dans ce cas de figure il faut examiner la variable pour essayer de comprendre pourquoi son KMO est faible. Cela peut venir de valeurs manquantes, d’une faible variance, ou encore d’une mauvaise corrélation avec les autres variables. Cette variable peut empêcher au modèle d’être mis en lumière correctement et provoquer du bruit. Il faudrait donc envisager de la retirer du modèle.

<<<<<<< HEAD =======

5.1.3.2 Test de Bartlett

>>>>>>> master

Il faut également vérifier que notre matice de corrélation n’est pas une matrice d’identité. C’est-à-dire une matrice de corrélation où toutes nos variables sont parfaitement indépendantes, à savoir où toutes les corrélations sont égales à 0. Pour celà nous utilisons le test de sphéricité de Bartlett (Bartlett, M.S., 1937). Pour valider ce pré-requis il est nécessaire que le test soit significatif (p < 0,05) pour accepter l’idée que notre matrice de corrélation est significativement différente d’une matrice d’identité.

Pour réaliser un KMO et le test de Bartlett on peut utiliser la librairie psych avec les fonctions KMO() et cortest.bartlett(). Une alternative intéressante est la fonction check_factostructure() du package performance, cette fonction réalise les deux tests et nous indique si nos données sont appropriées pour réaliser une analyse factorielle.

<<<<<<< HEAD
#Avec psych
## KMO
KMO(dfzpp)
=======
#Avec psych
## KMO
KMO(dfzpp)
>>>>>>> master
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = dfzpp)
Overall MSA =  0.81
MSA for each item = 
                        prix_med                     perc_log_vac 
                            0.76                             0.74 
                     perc_maison                    perc_tiny_log 
                            0.81                             0.78 
                        dens_pop                   med_niveau_vis 
                            0.88                             0.76 
             part_agri_nb_emploi part_cadre_profintellec_nbemploi 
                            0.90                             0.84 
<<<<<<< HEAD
## Test de sphéricité
cortest.bartlett(dfzpp, n=1222)
=======
## Test de sphéricité
cortest.bartlett(dfzpp, n=1222)
>>>>>>> master
$chisq
[1] 5827.853

$p.value
[1] 0

$df
[1] 28
<<<<<<< HEAD
# Avec performance
performance::check_factorstructure(dfzpp)
=======
# Avec performance
performance::check_factorstructure(dfzpp)
>>>>>>> master
# Is the data suitable for Factor Analysis?


  - Sphericity: Bartlett's test of sphericity suggests that there is sufficient significant correlation in the data for factor analysis (Chisq(28) = 5827.85, p < .001).
  - KMO: The Kaiser, Meyer, Olkin (KMO) overall measure of sampling adequacy suggests that data seems appropriate for factor analysis (KMO = 0.81). The individual KMO scores are: prix_med (0.76), perc_log_vac (0.74), perc_maison (0.81), perc_tiny_log (0.78), dens_pop (0.88), med_niveau_vis (0.76), part_agri_nb_emploi (0.90), part_cadre_profintellec_nbemploi (0.84).

Dans notre cas nous avons donc un KMO global méritoire (0.81) et des KMO par variable satisfaisants. Le test de sphéricité nous indique que notre matrice de corrélation n’est pas une matrice d’identité. Nous pouvons donc nous lancer dans l’AFE!

<<<<<<< HEAD =======
>>>>>>> master

5.2 Combien de facteurs retenir ?

Lorsque l’on procède à une analyse factorielle il est très souvent nécessaire de définir le nombre de composantes que l’on souhaite (pour l’ACP) ou de facteurs latents (AFE) en amont. Cette décision repose sur l’étude des valeures propres et il existe un grand nombre d’indices et de méthodes (comme par exemple le coude de Katell, la règle de Kaiser-Guttman…). Cependant, il n’existe pas de consensus sur quelle méthode choisir et laquelle serait la plus appropriée selon les cas.

Makowski en 2018, propose de se reposer sur un consensus parmi les méthodes plutôt que sur une méthode en particulier (Makowski, 2018). Il implémente sa solution dans le packge psycho puis dans la fonctionn_factors() dans le package parameters. C’est ce que nous utiliserons ici pour définir le nombre adéquat de facteurs à retenir pour notre analyse.

<<<<<<< HEAD
# Identification du nombre de facteurs
library(parameters)
n <- n_factors(dfzpp)
n
# Method Agreement Procedure:

The choice of 1 dimensions is supported by 4 (28.57%) methods out of 14 (t, p, Acceleration factor, Scree (R2)).
# Plus de détail peuvent être obtenu en pasant au format data frame et en utilisant summary()

nb_factor <- as.data.frame(n)

head(nb_factor)
=======
# Identification du nombre de facteurs
library(parameters)
n <- n_factors(dfzpp)
n
# Method Agreement Procedure:

The choice of 2 dimensions is supported by 6 (31.58%) methods out of 19 (Optimal coordinates, Parallel analysis, Kaiser criterion, Scree (SE), VSS complexity 2, Velicer's MAP).
# Plus de détail peuvent être obtenu en pasant au format data frame et en utilisant summary()

nb_factor <- as.data.frame(n)

head(nb_factor)
>>>>>>> master
  n_Factors              Method              Family
1         1                   t Multiple_regression
2         1                   p Multiple_regression
3         1 Acceleration factor               Scree
4         1          Scree (R2)            Scree_SE
<<<<<<< HEAD
5         2 Optimal coordinates               Scree
6         2   Parallel analysis               Scree
summary(n)
  n_Factors n_Methods
1         1         4
2         2         4
3         3         1
4         4         1
5         5         1
6         6         2
7         7         1
# On peut également représenter le nombre de facteurs.
library(see)
plot(n, type="line") + theme_modern()

# et visualiser le graphique des valeures propres
SCREE_PLOT(dfzpp, corkind="spearman", verbose=T)

======= 5 1 VSS complexity 1 VSS 6 2 Optimal coordinates Scree
summary(n)
  n_Factors n_Methods Variance_Cumulative
1         1         5           0.5136409
2         2         6           0.6510016
3         3         1           0.6970123
4         4         3           0.7301025
5         5         1           0.7509842
6         6         2           0.7532000
7         7         1           0.7540760
# On peut également représenter le nombre de facteurs.
library(see)
plot(n, type="line") + theme_modern()

# et visualiser le graphique des valeures propres
SCREE_PLOT(dfzpp, corkind="spearman", verbose=T)

>>>>>>> master
            Eigenvalues    Proportion of Variance    Cumulative Prop. Variance
Factor 1           4.80                      0.60                         0.60
Factor 2           1.41                      0.18                         0.78
Factor 3           0.56                      0.07                         0.85
Factor 4           0.42                      0.05                         0.90
Factor 5           0.28                      0.03                         0.93
Factor 6           0.26                      0.03                         0.97
Factor 7           0.15                      0.02                         0.98
Factor 8           0.13                      0.02                         1.00
<<<<<<< HEAD

Ici on voit très clairement qu’il est nécessaire de creuser un peu plus loin. Les résultats bruts renvoient un seul facteur latent, ce qui peut être tout à fait logique vu le petit nombre de variables que nous avons. C’est aussi une des forces de l’AFE de pouvoir faire émerger un seul facteur latent global au sein duquel se projeterait toutes nos variables. C’est un résultat qui peut être très intéressant.

Toutefois, on voit également que 6 méthodes font également consensus sur deux facteurs latents.

Ainsi quel est le meilleur modèle ?

=======

Ici les résultats bruts renvoient 2 facteurs latents. Mais 5 méthodes, ce qui est important, font également consensus autour d’un seul facteur, ce qui peut être tout à fait logique vu le petit nombre de variables que nous avons. C’est aussi une des forces de l’AFE de pouvoir faire émerger un seul facteur latent global au sein duquel se projeterait toutes nos variables. C’est un résultat qui peut être très intéressant.

Il pourrait être très intéressant de creuser un peu plus loin. Mais cela pose une question fondamentale : quel est le meilleur modèle ?

>>>>>>> master

L’analyse factorielle confirmatoire que nous allons vous présenter par la suite va nous permettre de décider. En attendant, nous pouvons lancer les deux analyses !

Pour réaliser ces analyses il va falloir déterminer la méthode de factorisation. C’est-à-dire définir sur quelle mesure on se base pour extraire les facteurs de notre set de variables. Les méthodes les plus courament utilisées sont celles qui se basent soit sur le maximum de vraisemblance (maximum likelihood), soit sur les méthodes des moindres carrés (pondérés ou non) (weighted or unweighted least square) (Tabachnick, B. G., & Fidell, L. S., 2014). Dans notre exemple, après observation des distributions de nos données, nous avons choisi de réaliser nos analyses avec la méthode de factorisation du maximum de vraisemblance robuste (mlr). Cette méthode permet d’optimiser le calcul des distances et la version robuste est adaptée à des données non normales (Kyriazos & Poga, 2023).

5.3 Lancement des AFE

1er modèle à un 1 facteur :

<<<<<<< HEAD
# Utilisation de mlr méthode considérée comme plus robuste même pour des données non-normales

# Pour avoir mlr il faut utiliser la syntaxe ci-dessous :
# Nous n'utilisons pas de méthode de rotation car nous testons la solution à 1 seul facteur
efa1immo <- lavaan::efa(dfzpp, nfactors = 1, estimator = "MLR")

print(efa1immo)
=======
# Utilisation de mlr méthode considérée comme plus robuste même pour des données non-normales

# Pour avoir mlr il faut utiliser la syntaxe ci-dessous :
# Nous n'utilisons pas de méthode de rotation car nous testons la solution à 1 seul facteur
efa1immo <- lavaan::efa(dfzpp, nfactors = 1, estimator = "MLR")

print(efa1immo)
>>>>>>> master

                                     f1 
prix_med                          0.686*
perc_log_vac                     -0.447*
perc_maison                      -0.790*
perc_tiny_log                     0.843*
dens_pop                          0.703*
med_niveau_vis                    0.438*
part_agri_nb_emploi              -0.650*
part_cadre_profintellec_nbemploi  0.831*

Avec un seul facteur toutes nos variables corrèlent donc avec un facteur latent. Dans notre cas on a toute une partie qui corrèle positivement et l’autre négativement. Ainsi, le pourcentage de petit logements, la part des cadres dans l’emploi, le prix median du m², la densité de population et le niveau de vie médian corrèlent positivement et à l’inverse, le pourcentage de maison, la part d’agriculteurs dans l’emploi et le pourcentage de logements vacant corrèlent négativement. Cela laisse à penser à une dichotomie qui serait ville / campagne. Ainsi le facteur latent exprimé par nos huit variables qui caractérisent nos EPCI, serait une dimension sur le niveau d’urbanité ou de ruralité.

L’avantage de l’AFE c’est qu’une fois le facteur latent identifié, nous pouvons, pour chaque individu obenir un score sur ce facteur latent. Dans notre exemple, vu la dimension spatiale des données il faudrait ensuite les cartographier pour visualiser spatialement l’information. L’intérêt des scores factoriels étant d’être ré-utilisés soit dans des analyses complémentaires, soit directement pour comprendre la structure de nos données. Dans notre cas, on pourrait s’en servir pour définir un score d’urbanité et de ruralité puis le représenter

<<<<<<< HEAD
# Extraction des scores factoriels par observation
factor_scores_immo<-predict(efa1immo)

# Regardons  les 5 premières lignes
head(factor_scores_immo, 5)
=======
# Extraction des scores factoriels par observation
factor_scores_immo<-predict(efa1immo)

# Regardons  les 5 premières lignes
head(factor_scores_immo, 5)
>>>>>>> master
              f1
[1,]  1.37802423
[2,] -0.22773769
[3,]  0.07818743
[4,] -0.05003235
[5,] -0.42494739
<<<<<<< HEAD
# Extraction des charges factorielles par variable
factor_loadings_immo <- efa1immo$loadings

# Afficher les charges factorielles
print(factor_loadings_immo)
=======
# Extraction des charges factorielles par variable
factor_loadings_immo <- efa1immo$loadings

# Afficher les charges factorielles
print(factor_loadings_immo)
>>>>>>> master
                                     f1
prix_med                          0.686
perc_log_vac                     -0.447
perc_maison                      -0.790
perc_tiny_log                     0.843
dens_pop                          0.703
med_niveau_vis                    0.438
part_agri_nb_emploi              -0.650
part_cadre_profintellec_nbemploi  0.831

Testons le modèle à deux facteurs !

<<<<<<< HEAD
# Utilisation de mlr méthode considérée comme plus robuste même pour données non-normales
# Utilisation d'une méthode de rotation promax car nous testons un modèle à2 facteurs

efa2immo <- lavaan::efa(dfzpp, nfactors = 2, estimator = "MLR", rotation = "promax")
loads2immo<-print(efa2immo)
=======
# Utilisation de mlr méthode considérée comme plus robuste même pour données non-normales
# Utilisation d'une méthode de rotation promax car nous testons un modèle à2 facteurs

efa2immo <- lavaan::efa(dfzpp, nfactors = 2, estimator = "MLR", rotation = "promax")
loads2immo<-print(efa2immo)
>>>>>>> master

                                     f1     f2
prix_med                          0.922       
perc_log_vac                     -0.886      .
perc_maison                           . -0.680
perc_tiny_log                         .  1.088
dens_pop                                 0.679
med_niveau_vis                    0.689       
part_agri_nb_emploi                   . -0.425
part_cadre_profintellec_nbemploi      .  0.720
<<<<<<< HEAD
loads2immo
=======
loads2immo
>>>>>>> master
[[1]]
                                         f1          f2
prix_med                          0.9218108  0.04752817
perc_log_vac                     -0.8864241  0.21359654
perc_maison                      -0.1861246 -0.67992319
perc_tiny_log                    -0.2061558  1.08843752
<<<<<<< HEAD
dens_pop                          0.0253656  0.67856183
=======
dens_pop                          0.0253656  0.67856182
>>>>>>> master
med_niveau_vis                    0.6885109 -0.08577373
part_agri_nb_emploi              -0.2532162 -0.42512873
part_cadre_profintellec_nbemploi  0.1123612  0.71993957

Cette structure à deux facteurs est également très intéressante, et a permis de faire émerger en plus du facteur latent, qui serait urbanité/ruralité, un autre facteur représentant le côut de la vie. Au niveau de ce facteur on observe une corrélation positive avec le prix médian de l’immobilier au m² et le niveau de vie médian, et négative avec le pourcentage de logement vacant. Ainsi, les EPCI ayant un score élevé sur ce facteur latent seraient les EPCI où le niveau de vie médian et le prix de l’immobilier seraient le plus élévés.

Extraction des charges factorielles par variable :

<<<<<<< HEAD
factor_loadings_immo2 <- efa2immo$loadings

# Afficher les charges factorielles
print(factor_loadings_immo2)
=======
factor_loadings_immo2 <- efa2immo$loadings

# Afficher les charges factorielles
print(factor_loadings_immo2)
>>>>>>> master
                                     f1     f2
prix_med                          0.922  0.048
perc_log_vac                     -0.886  0.214
perc_maison                      -0.186 -0.680
perc_tiny_log                    -0.206  1.088
dens_pop                          0.025  0.679
med_niveau_vis                    0.689 -0.086
part_agri_nb_emploi              -0.253 -0.425
part_cadre_profintellec_nbemploi  0.112  0.720

Une fois de plus nous pouvons extraire les scores de ces deux facteurs latents de ce second modèle.

<<<<<<< HEAD
# Extraction des scores factoriels par observation
factor_scores_immo2<-predict(efa2immo)

# Regardons  les 5 premières lignes
head(factor_scores_immo2, 5)
=======
# Extraction des scores factoriels par observation
factor_scores_immo2<-predict(efa2immo)

# Regardons  les 5 premières lignes
head(factor_scores_immo2, 5)
>>>>>>> master
             f1         f2
[1,]  1.1630309  1.7195533
[2,]  0.1358464 -0.3291296
[3,] -0.9112937  0.3642026
[4,] -0.1611307 -0.1211379
[5,] -0.3071902 -0.5258387

Il est tout à fait possible dans le cadre de l’AFE d’emprunter une représentation classique de l’ACP (le scatter plot) pour représenter nos variables et leurs charges factorielles. Cette représentation peut s’avérer également utile pour mieux comprendre nos facteurs latents.

<<<<<<< HEAD
# Graphique


# Extraire les charges factorielles
factor_loadings_immo2 <- efa2immo$loadings

# transformer les charges factorielles dans un data frame
factor_loadings_dfimmo2 <- as.data.frame(factor_loadings_immo2)

# Renommer les colonnes
colnames(factor_loadings_dfimmo2) <- c("Factor", "Loading")

#  Ajouter une variables pour identifier nos charges factorielles
factor_loadings_dfimmo2$Item <- rownames(factor_loadings_dfimmo2)

# charger ggplot2
library(ggplot2)

# Réaliser un graphique des charges factorielles
ggplot(factor_loadings_dfimmo2, aes(x = Factor, y = Loading, label = Item)) +
  geom_point() +
  geom_text(size = 3, hjust = -0.1) +
  labs(x = "Factor", y = "Loading", title = "Factor Loadings Plot") +
  theme_minimal()

=======
# Graphique


# Extraire les charges factorielles
factor_loadings_immo2 <- efa2immo$loadings

# transformer les charges factorielles dans un data frame
factor_loadings_dfimmo2 <- as.data.frame(factor_loadings_immo2)

# Renommer les colonnes
colnames(factor_loadings_dfimmo2) <- c("Factor", "Loading")

#  Ajouter une variables pour identifier nos charges factorielles
factor_loadings_dfimmo2$Item <- rownames(factor_loadings_dfimmo2)

# charger ggplot2
library(ggplot2)

# Réaliser un graphique des charges factorielles
ggplot(factor_loadings_dfimmo2, aes(x = Factor, y = Loading, label = Item)) +
  geom_point() +
  geom_text(size = 3, hjust = -0.1) +
  labs(x = "Factor", y = "Loading", title = "Factor Loadings Plot") +
  theme_minimal()

>>>>>>> master

6 L’Analyse factorielle confirmatoire

L’analyse factorielle confirmatoire est une technique statistique utilisée pour tester un modèle factoriel.

Si dans le cas de l’AFE les facteurs latents émergent de manière exploratoire à partir des données, dans le cadre de l’analyse factorielle confirmatoire il s’agira de tester au contraire un modèle avec des hypothèses pré-établies sur nos facteurs latents. Nous allons imposer une structure aux données et étudier dans quelle mesure les <<<<<<< HEAD données vont correspondre à cette structure prédéfinie.

======= données vont correspondre à cette structure prédéfinie. Nous pourrons ainsi, utiliser la CFA, entre autres pour vérifier la stabilité d’un modèle dans le temps, vérifier des outils de mesure ou encore étudier quels modèle semble le plus pertinent.

>>>>>>> master

C’est en ce sens que cette analyse est confirmatoire. Nous étudions comment un modèle pré-établi dans le cadre d’une théorie, ou suite à une première analyse statistique sur des données, est confirmée par les données observées.

<<<<<<< HEAD =======

LA CFA, se déroule en plusieurs étapes :

>>>>>>> master

1- Définir un modèle Préalable : Spécifier un modèle factoriel a priori, indiquant la relation entre les variables observées et les facteurs latents que nous supposons. Le modèle peut également inclure des relations entre les facteurs latents.

2- Obtenir les estimations des paramètres : les différents paramètres de l’analyse factorielle confirmatoire (charges factorielles, covariances entre les facteurs latents…) sont estimés à l’aide de nos données observées. L’objectif de l’analyse étant d’obtenir des estimations qui maximisent l’ajustement entre les données observées et le modèle.

3- Lire les critères d’ajustement : La qualité et l’ajustement du modèle sont évalués en utilisant divers critères statistiques évaluant la position du modèle entre un modèle nul (sans aucun lien) et un modèle saturé (avec des liens très maximum partout). Les indices utilisés sont notamment : le chi², le RMSEA, le CFI, etc.

4- Interpréter les résultats : Les charges factorielles indiquent la force et la direction de la relation entre chaque variable observée et son facteur latent correspondant. A partir de ces indications, nous pouvons interpréter les résultats et vérifier si la structure obtenue est bien dans le même sens que celle envisagée.

5- Modifier le modèle : Si le modèle ne s’ajuste pas bien (que les indices d’ajustement ne sont pas satisfaisants), des modifications peuvent être apportées, comme la suppression ou l’ajout de liens entre les facteurs et les variables observées, pour améliorer l’ajustement. Attention toutefois à rester dans un cadre théorique cohérent et ne pas tester des liens qui n’ont pas de sens.

Tout l’enjeu en cas de non ajustement du modèle va être de comprendre et d’analyser pourquoi le modèle ne s’ajuste pas. Cela peut venir d’un modèle théorique qui n’est pas adapté aux données observées ou à des variations entre la première analyse, qui permet d’établir un premier modèle, et sa confirmation via l’analyse factorielle confirmatoire.

L’analyse factorielle confirmatoire est donc un très bon complément à l’AFE. Il est d’ailleurs très fréquent que ces deux méthodes soient utilisées ensemble. C’est même plutôt recommandé, tels que l’argumentent Flora & Flake dans un article paru en 2017 (Flora & Flake, 2017). Il est préférable de ne pas réaliser l’analyse factorielle confirmatoire sur le même jeu de données que l’AFE pour éliminer toute spécificité liée à l’échantillonnage. Néanmoins il est envisageable d’utiliser une partie des données comme échantillon d’entrainement pour identifier des facteurs latents (AFE) et l’autre partie comme échantillon test pour tester le modèle (CFA). Pour réaliser efficacement le duo AFE/AFC il est nécessaire d’avoir une base de données avec un grand nombre d’individus surtout afin de permettre la création d’un échantillon d’entrainement et de test suffisamment grand. Il est de pratique courante de diviser un échantillon en deux parties de façon aléatoire. Sur une première moitié sera alors réalisée l’AFE et sur la seconde moitié l’AFC.

6.1 Quel modèle choisir ?

6.1.1 L’analyse factorielle confirmatoire en pratique

L’analyse factorielle confirmatoire fait partie du champs des équations structurelles, sa mise en oeuvre se fait très bien sur R. L’avantage des équations structurelles c’est qu’à la manière de l’ACP nous pourrons représenter graphiquement les modèles obtenus.

1- Etape 1 : partitionnement des données :

<<<<<<< HEAD
## En premier lien le partitionnement des data
partitions <- datawizard::data_partition(dfzpp, proportion = 0.5) # ici division du corpus eavec 50% des individus dasn l'échantillon d'entrainement
training <- partitions$p_0.5
test <- partitions$test

training$.row_id <- NULL
test$.row_id <- NULL

2- Etape 2 : Réalisation des AFE sur la partition d’entrainement

# modèle à 1 facteur
efa1immo_F1 <- lavaan::efa(training, nfactors = 1, estimator = "MLR")


# modèle à 2 facteurs
efa2immo_F2 <- lavaan::efa(training, nfactors = 2, estimator = "MLR", rotation = "promax")

3- Etape 3 : Réaliser une analyse factorielle confirmatoire

library(lavaan)

attach(test) # nécessaire à cause du package lavaan

# modèle à 1 facteur
model1F<- 'F1 =~ prix_med + perc_log_vac + perc_maison + perc_tiny_log + dens_pop + med_niveau_vis + part_agri_nb_emploi + part_cadre_profintellec_nbemploi'

fact_1immo <- cfa(model1F, std.lv=T, estimator="MLR", data=test)

# modèle à 2 facteurs
model2F<- 'F1 =~ prix_med + perc_log_vac + med_niveau_vis
           F2 =~ perc_maison + perc_tiny_log + dens_pop + part_agri_nb_emploi + part_cadre_profintellec_nbemploi'
fact_2immo <- cfa(model2F, std.lv=T, estimator="MLR", data=test)
=======
## En premier lien le partitionnement des data
partitions <- datawizard::data_partition(dfzpp, proportion = 0.5) # ici division du corpus eavec 50% des individus dasn l'échantillon d'entrainement
training <- partitions$p_0.5
test <- partitions$test

training$.row_id <- NULL
test$.row_id <- NULL

2- Etape 2 : Réalisation des AFE sur la partition d’entrainement

# modèle à 1 facteur
efa1immo_F1 <- lavaan::efa(training, nfactors = 1, estimator = "MLR")


# modèle à 2 facteurs
efa2immo_F2 <- lavaan::efa(training, nfactors = 2, estimator = "MLR", rotation = "promax")

3- Etape 3 : Réaliser une analyse factorielle confirmatoire

library(lavaan)

attach(test) # nécessaire à cause du package lavaan

# modèle à 1 facteur
model1F<- 'F1 =~ prix_med + perc_log_vac + perc_maison + perc_tiny_log + dens_pop + med_niveau_vis + part_agri_nb_emploi + part_cadre_profintellec_nbemploi'

fact_1immo <- cfa(model1F, std.lv=T, estimator="MLR", data=test)

# modèle à 2 facteurs
model2F<- 'F1 =~ prix_med + perc_log_vac + med_niveau_vis
           F2 =~ perc_maison + perc_tiny_log + dens_pop + part_agri_nb_emploi + part_cadre_profintellec_nbemploi'
fact_2immo <- cfa(model2F, std.lv=T, estimator="MLR", data=test)
>>>>>>> master

Etape 3 : étudier la convergence de nos deux modèles

Attention les sorties d’un modèle d’analyse factorielle confirmatoire sont nombreuses, nous les détaillons ici pour en avoir une première lecture mais leurs analyses se feront véritablement à l’aide d’autres fonctions. Il faut retenir que deux grandes étapes seront à évaluer : l’adéquation de nos données au modèle proposé (avec la vérification des <<<<<<< HEAD indices d’ajustement au modèle) et si le modèle s’ajuste correctement nous pourrons alors étudier la structure de celui-ci par la force et le signe des saturations obtenues.

res_fact1immo <- summary(fact_1immo, standardized=T, modindices = T, fit.measures=T, rsquare=T)

# Pour voir les différents éléments qui composent notre summary de notre modèle
summary(res_fact1immo)
======= indices d’ajustement au modèle) - on parle de modèle de mesure - et si le modèle s’ajuste correctement nous pourrons alors étudier la structure de celui-ci par la force et le signe des saturations obtenues - on parle alors de modèle de structure.

res_fact1immo <- summary(fact_1immo, standardized=T, modindices = T, fit.measures=T, rsquare=T)

# Pour voir les différents éléments qui composent notre summary de notre modèle
summary(res_fact1immo)
>>>>>>> master
       Length Class             Mode   
header  5     -none-            list   
optim   9     -none-            list   
data    2     -none-            list   
test    2     -none-            list   
fit    49     lavaan.vector     numeric
<<<<<<< HEAD
pe     11     data.frame        list   
mi      8     lavaan.data.frame list   
resfact2immo <- summary(fact_2immo, standardized=T, modindices = T, fit.measures=T, rsquare=T)
======= pe 10 data.frame list mi 8 lavaan.data.frame list
resfact2immo <- summary(fact_2immo, standardized=T, modindices = T, fit.measures=T, rsquare=T)
>>>>>>> master
  • header : contient des éléments contextuels sur notre fonction (version du package…) ainsi que les mesures d’ajustement si fitMeasures=TRUE
  • optim : liste d’information concernant l’optimisation du modèle
  • data : des éléments sur nos données
  • test : les résultats des différents tests
  • fit : Résultats des différents test d’ajustement du modèle
  • pe : les différents paramètres des relations au sein du modèle sous la forme d’un data frame des facteurs latent et de la variance
  • <<<<<<< HEAD
  • mi: si modindices=TRUE, il s’agit des suggestions proposées par la foncions pour améliorer notre modèle

Voici donc la sortie brute de summary, on retrouve également les R2

#exemple pour le modèle à 1 facteur
res_fact1immo
lavaan 0.6.16 ended normally after 20 iterations
=======
  • mi: si modindices=TRUE, il s’agit des suggestions proposées par la fonction pour améliorer notre modèle.
  • ATTENTION cette option est à utiliser avec grandes précautions. L’idée ici est bien de tester un modèle théorique pré-établi et donc chaque modifications proposées qui seraient ajoutées au modèle final doit pouvoir se justifier théoriquement. La corrélation de l’ensemble des erreurs de mesure ensemble, comme c’est souvent proposé par cette option, est difficile à justifier dans un modèle théorique pré-établi.

    Voici donc la sortie brute de summary, on retrouve également les R2

    #exemple pour le modèle à 1 facteur
    res_fact1immo
    lavaan 0.6-19 ended normally after 22 iterations
    >>>>>>> master
    
      Estimator                                         ML
      Optimization method                           NLMINB
      Number of model parameters                        16
    
      Number of observations                           611
    
    Model Test User Model:
                                                  Standard      Scaled
    <<<<<<< HEAD
      Test Statistic                               883.002     551.126
      Degrees of freedom                                20          20
      P-value (Chi-square)                           0.000       0.000
      Scaling correction factor                                  1.602
    =======
      Test Statistic                               923.457     567.102
      Degrees of freedom                                20          20
      P-value (Chi-square)                           0.000       0.000
      Scaling correction factor                                  1.628
    >>>>>>> master
        Yuan-Bentler correction (Mplus variant)                       
    
    Model Test Baseline Model:
    
    <<<<<<< HEAD
      Test statistic                              2800.713    1396.950
      Degrees of freedom                                28          28
      P-value                                        0.000       0.000
      Scaling correction factor                                  2.005
    
    User Model versus Baseline Model:
    
      Comparative Fit Index (CFI)                    0.689       0.612
      Tucker-Lewis Index (TLI)                       0.564       0.457
                                                                      
      Robust Comparative Fit Index (CFI)                         0.690
      Robust Tucker-Lewis Index (TLI)                            0.566
    
    Loglikelihood and Information Criteria:
    
      Loglikelihood user model (H0)              -5655.633   -5655.633
      Scaling correction factor                                  4.117
          for the MLR correction                                      
      Loglikelihood unrestricted model (H1)      -5214.132   -5214.132
      Scaling correction factor                                  2.720
          for the MLR correction                                      
                                                                      
      Akaike (AIC)                               11343.266   11343.266
      Bayesian (BIC)                             11413.907   11413.907
      Sample-size adjusted Bayesian (SABIC)      11363.111   11363.111
    
    Root Mean Square Error of Approximation:
    
      RMSEA                                          0.266       0.208
      90 Percent confidence interval - lower         0.251       0.197
      90 Percent confidence interval - upper         0.281       0.220
      P-value H_0: RMSEA <= 0.050                    0.000       0.000
      P-value H_0: RMSEA >= 0.080                    1.000       1.000
                                                                      
      Robust RMSEA                                               0.264
      90 Percent confidence interval - lower                     0.245
      90 Percent confidence interval - upper                     0.283
    =======
      Test statistic                              3084.675    1621.522
      Degrees of freedom                                28          28
      P-value                                        0.000       0.000
      Scaling correction factor                                  1.902
    
    User Model versus Baseline Model:
    
      Comparative Fit Index (CFI)                    0.704       0.657
      Tucker-Lewis Index (TLI)                       0.586       0.519
                                                                      
      Robust Comparative Fit Index (CFI)                         0.706
      Robust Tucker-Lewis Index (TLI)                            0.589
    
    Loglikelihood and Information Criteria:
    
      Loglikelihood user model (H0)              -5561.143   -5561.143
      Scaling correction factor                                  3.466
          for the MLR correction                                      
      Loglikelihood unrestricted model (H1)      -5099.414   -5099.414
      Scaling correction factor                                  2.445
          for the MLR correction                                      
                                                                      
      Akaike (AIC)                               11154.286   11154.286
      Bayesian (BIC)                             11224.928   11224.928
      Sample-size adjusted Bayesian (SABIC)      11174.131   11174.131
    
    Root Mean Square Error of Approximation:
    
      RMSEA                                          0.272       0.212
      90 Percent confidence interval - lower         0.257       0.200
      90 Percent confidence interval - upper         0.287       0.223
      P-value H_0: RMSEA <= 0.050                    0.000       0.000
      P-value H_0: RMSEA >= 0.080                    1.000       1.000
                                                                      
      Robust RMSEA                                               0.270
      90 Percent confidence interval - lower                     0.251
      90 Percent confidence interval - upper                     0.289
    >>>>>>> master
      P-value H_0: Robust RMSEA <= 0.050                         0.000
      P-value H_0: Robust RMSEA >= 0.080                         1.000
    
    Standardized Root Mean Square Residual:
    
    <<<<<<< HEAD
      SRMR                                           0.124       0.124
    =======
      SRMR                                           0.118       0.118
    >>>>>>> master
    
    Parameter Estimates:
    
      Standard errors                             Sandwich
      Information bread                           Observed
      Observed information based on                Hessian
    
    Latent Variables:
                       Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
      F1 =~                                                                 
    <<<<<<< HEAD
        prix_med          0.610    0.045   13.525    0.000    0.610    0.654
        perc_log_vac     -0.410    0.044   -9.218    0.000   -0.410   -0.417
        perc_maison      -0.757    0.037  -20.182    0.000   -0.757   -0.781
        perc_tiny_log     0.803    0.064   12.504    0.000    0.803    0.844
        dens_pop          0.545    0.075    7.257    0.000    0.545    0.712
        med_niveau_vis    0.357    0.050    7.103    0.000    0.357    0.384
        part_gr_nb_mpl   -0.653    0.037  -17.637    0.000   -0.653   -0.626
        prt_cdr_prfnt_    0.773    0.064   12.167    0.000    0.773    0.824
    
    Variances:
                       Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
       .prix_med          0.499    0.075    6.673    0.000    0.499    0.573
       .perc_log_vac      0.799    0.052   15.229    0.000    0.799    0.826
       .perc_maison       0.367    0.047    7.788    0.000    0.367    0.390
       .perc_tiny_log     0.261    0.033    7.809    0.000    0.261    0.288
       .dens_pop          0.288    0.073    3.956    0.000    0.288    0.492
       .med_niveau_vis    0.741    0.096    7.752    0.000    0.741    0.853
       .part_gr_nb_mpl    0.661    0.088    7.552    0.000    0.661    0.608
       .prt_cdr_prfnt_    0.282    0.051    5.490    0.000    0.282    0.321
    =======
        prix_med          0.666    0.048   13.871    0.000    0.666    0.707
        perc_log_vac     -0.456    0.045  -10.030    0.000   -0.456   -0.468
        perc_maison      -0.789    0.041  -19.215    0.000   -0.789   -0.809
        perc_tiny_log     0.858    0.063   13.556    0.000    0.858    0.859
        dens_pop          0.495    0.064    7.789    0.000    0.495    0.729
        med_niveau_vis    0.435    0.059    7.407    0.000    0.435    0.424
        part_gr_nb_mpl   -0.637    0.032  -19.827    0.000   -0.637   -0.648
        prt_cdr_prfnt_    0.823    0.062   13.325    0.000    0.823    0.817
    
    Variances:
                       Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
       .prix_med          0.444    0.049    9.077    0.000    0.444    0.500
       .perc_log_vac      0.741    0.048   15.550    0.000    0.741    0.781
       .perc_maison       0.328    0.039    8.389    0.000    0.328    0.345
       .perc_tiny_log     0.262    0.036    7.382    0.000    0.262    0.262
       .dens_pop          0.216    0.051    4.251    0.000    0.216    0.469
       .med_niveau_vis    0.863    0.114    7.589    0.000    0.863    0.820
       .part_gr_nb_mpl    0.563    0.057    9.792    0.000    0.563    0.581
       .prt_cdr_prfnt_    0.338    0.048    6.974    0.000    0.338    0.333
    >>>>>>> master
        F1                1.000                               1.000    1.000
    
    R-Square:
                       Estimate
    <<<<<<< HEAD
        prix_med          0.427
        perc_log_vac      0.174
        perc_maison       0.610
        perc_tiny_log     0.712
        dens_pop          0.508
        med_niveau_vis    0.147
        part_gr_nb_mpl    0.392
        prt_cdr_prfnt_    0.679
    =======
        prix_med          0.500
        perc_log_vac      0.219
        perc_maison       0.655
        perc_tiny_log     0.738
        dens_pop          0.531
        med_niveau_vis    0.180
        part_gr_nb_mpl    0.419
        prt_cdr_prfnt_    0.667
    >>>>>>> master
    
    Modification Indices:
    
                       lhs op                              rhs      mi    epc
    <<<<<<< HEAD
    1             prix_med ~~                     perc_log_vac 284.482 -0.457
    2             prix_med ~~                      perc_maison  42.846 -0.135
    3             prix_med ~~                    perc_tiny_log  96.378 -0.188
    4             prix_med ~~                         dens_pop  14.313 -0.066
    5             prix_med ~~                   med_niveau_vis 148.482  0.317
    6             prix_med ~~              part_agri_nb_emploi   3.238 -0.046
    7             prix_med ~~ part_cadre_profintellec_nbemploi  19.414 -0.084
    8         perc_log_vac ~~                      perc_maison   4.687  0.053
    9         perc_log_vac ~~                    perc_tiny_log 132.182  0.257
    10        perc_log_vac ~~                         dens_pop   3.035  0.037
    11        perc_log_vac ~~                   med_niveau_vis  70.752 -0.268
    12        perc_log_vac ~~              part_agri_nb_emploi   5.183  0.071
    13        perc_log_vac ~~ part_cadre_profintellec_nbemploi  14.426  0.086
    14         perc_maison ~~                    perc_tiny_log  30.445 -0.104
    15         perc_maison ~~                         dens_pop   6.599  0.042
    16         perc_maison ~~                   med_niveau_vis  11.288  0.079
    17         perc_maison ~~              part_agri_nb_emploi   2.149  0.034
    18         perc_maison ~~ part_cadre_profintellec_nbemploi  79.007  0.166
    19       perc_tiny_log ~~                         dens_pop  49.218  0.107
    20       perc_tiny_log ~~                   med_niveau_vis  75.760 -0.186
    21       perc_tiny_log ~~              part_agri_nb_emploi   8.371  0.063
    22       perc_tiny_log ~~ part_cadre_profintellec_nbemploi  45.506  0.124
    23            dens_pop ~~                   med_niveau_vis  23.428 -0.098
    24            dens_pop ~~              part_agri_nb_emploi  31.546  0.112
    25            dens_pop ~~ part_cadre_profintellec_nbemploi  13.468  0.056
    26      med_niveau_vis ~~              part_agri_nb_emploi   7.646 -0.082
    27      med_niveau_vis ~~ part_cadre_profintellec_nbemploi   9.536  0.067
    28 part_agri_nb_emploi ~~ part_cadre_profintellec_nbemploi   9.182 -0.066
       sepc.lv sepc.all sepc.nox
    1   -0.457   -0.724   -0.724
    2   -0.135   -0.316   -0.316
    3   -0.188   -0.520   -0.520
    4   -0.066   -0.174   -0.174
    5    0.317    0.522    0.522
    6   -0.046   -0.080   -0.080
    7   -0.084   -0.225   -0.225
    8    0.053    0.098    0.098
    9    0.257    0.562    0.562
    10   0.037    0.076    0.076
    11  -0.268   -0.348   -0.348
    12   0.071    0.097    0.097
    13   0.086    0.180    0.180
    14  -0.104   -0.337   -0.337
    15   0.042    0.128    0.128
    16   0.079    0.152    0.152
    17   0.034    0.070    0.070
    18   0.166    0.516    0.516
    19   0.107    0.390    0.390
    20  -0.186   -0.424   -0.424
    21   0.063    0.151    0.151
    22   0.124    0.455    0.455
    23  -0.098   -0.211   -0.211
    24   0.112    0.256    0.256
    25   0.056    0.195    0.195
    26  -0.082   -0.118   -0.118
    27   0.067    0.146    0.146
    28  -0.066   -0.153   -0.153
    ======= 1 prix_med ~~ perc_log_vac 280.382 -0.418 2 prix_med ~~ perc_maison 2.893 -0.032 3 prix_med ~~ perc_tiny_log 90.084 -0.176 4 prix_med ~~ dens_pop 9.173 -0.044 5 prix_med ~~ med_niveau_vis 192.810 0.372 6 prix_med ~~ part_agri_nb_emploi 1.587 -0.028 7 prix_med ~~ part_cadre_profintellec_nbemploi 4.958 -0.043 8 perc_log_vac ~~ perc_maison 2.046 -0.033 9 perc_log_vac ~~ perc_tiny_log 152.154 0.268 10 perc_log_vac ~~ dens_pop 4.556 0.037 11 perc_log_vac ~~ med_niveau_vis 74.469 -0.287 12 perc_log_vac ~~ part_agri_nb_emploi 23.104 0.133 13 perc_log_vac ~~ part_cadre_profintellec_nbemploi 4.396 0.049 14 perc_maison ~~ perc_tiny_log 101.598 -0.185 15 perc_maison ~~ dens_pop 3.005 0.023 16 perc_maison ~~ med_niveau_vis 22.454 0.116 17 perc_maison ~~ part_agri_nb_emploi 0.009 0.002 18 perc_maison ~~ part_cadre_profintellec_nbemploi 66.500 0.153 19 perc_tiny_log ~~ dens_pop 49.380 0.093 20 perc_tiny_log ~~ med_niveau_vis 100.209 -0.233 21 perc_tiny_log ~~ part_agri_nb_emploi 12.220 0.070 22 perc_tiny_log ~~ part_cadre_profintellec_nbemploi 21.143 0.087 23 dens_pop ~~ med_niveau_vis 24.475 -0.093 24 dens_pop ~~ part_agri_nb_emploi 19.608 0.070 25 dens_pop ~~ part_cadre_profintellec_nbemploi 4.914 0.031 26 med_niveau_vis ~~ part_agri_nb_emploi 6.315 -0.075 27 med_niveau_vis ~~ part_cadre_profintellec_nbemploi 16.626 0.102 28 part_agri_nb_emploi ~~ part_cadre_profintellec_nbemploi 11.370 -0.072 sepc.lv sepc.all sepc.nox 1 -0.418 -0.728 -0.728 2 -0.032 -0.085 -0.085 3 -0.176 -0.516 -0.516 4 -0.044 -0.141 -0.141 5 0.372 0.601 0.601 6 -0.028 -0.057 -0.057 7 -0.043 -0.112 -0.112 8 -0.033 -0.066 -0.066 9 0.268 0.608 0.608 10 0.037 0.094 0.094 11 -0.287 -0.358 -0.358 12 0.133 0.206 0.206 13 0.049 0.097 0.097 14 -0.185 -0.629 -0.629 15 0.023 0.087 0.087 16 0.116 0.217 0.217 17 0.002 0.005 0.005 18 0.153 0.459 0.459 19 0.093 0.389 0.389 20 -0.233 -0.490 -0.490 21 0.070 0.183 0.183 22 0.087 0.292 0.292 23 -0.093 -0.216 -0.216 24 0.070 0.201 0.201 25 0.031 0.113 0.113 26 -0.075 -0.107 -0.107 27 0.102 0.188 0.188 28 -0.072 -0.164 -0.164
    >>>>>>> master

    On peut également obtenir les saturations standardisées pour les deux modèles, ce qui sera intéressant dans une perspective de compréhension de la structure de la CFA, mais aussi de réutilisation dans des analyses complémentaires (régressions…).

    <<<<<<< HEAD
    ## Saturations standardisées
    resid(fact_1immo,type="standardized")
    =======
    ## Saturations standardisées
    resid(fact_1immo,type="standardized")
    >>>>>>> master
    $type
    [1] "standardized"
    
    $cov
                                      prx_md  prc_l_  prc_ms  prc_t_  dns_pp
    prix_med                           0.000                                
    <<<<<<< HEAD
    perc_log_vac                      -9.268   0.000                        
    perc_maison                       -2.223   1.364   0.000                
    perc_tiny_log                    -16.062  15.697  -3.445   0.000        
    dens_pop                          -4.045   2.249   2.974   3.520   0.000
    med_niveau_vis                     6.998  -8.768   3.121 -12.096  -4.509
    part_agri_nb_emploi               -1.745   2.308   1.481   4.163   5.342
    part_cadre_profintellec_nbemploi  -4.948   4.343  11.011   2.769   1.519
    =======
    perc_log_vac                     -10.184   0.000                        
    perc_maison                       -0.956  -1.133   0.000                
    perc_tiny_log                    -15.269  18.306  -4.081   0.000        
    dens_pop                          -2.784   2.417   1.525   3.458   0.000
    med_niveau_vis                     7.281  -8.507   3.612 -11.599  -4.034
    part_agri_nb_emploi               -1.204   4.081   0.100   4.134   3.721
    part_cadre_profintellec_nbemploi  -2.038   2.314   7.846   2.413   1.156
    >>>>>>> master
                                      md_nv_ prt_g__ prt_c__
    prix_med                                                
    perc_log_vac                                            
    perc_maison                                             
    perc_tiny_log                                           
    dens_pop                                                
    med_niveau_vis                     0.000                
    <<<<<<< HEAD
    part_agri_nb_emploi               -3.183   0.000        
    part_cadre_profintellec_nbemploi   2.354  -2.441   0.000
    resid(fact_2immo,type="standardized")
    ======= part_agri_nb_emploi -2.813 0.000 part_cadre_profintellec_nbemploi 2.548 -3.055 0.000
    resid(fact_2immo,type="standardized")
    >>>>>>> master
    $type
    [1] "standardized"
    
    $cov
                                     prx_md prc_l_ md_nv_ prc_ms prc_t_ dns_pp
    prix_med                          0.000                                   
    <<<<<<< HEAD
    perc_log_vac                     -0.008  0.000                            
    med_niveau_vis                    0.441 -3.130  0.000                     
    perc_maison                      -2.820  1.732  0.131  0.000              
    perc_tiny_log                    -8.153  5.891 -2.293 -1.915  0.000       
    dens_pop                         -1.697  0.979 -1.613  3.528  2.330  0.000
    part_agri_nb_emploi              -4.195  3.250 -4.628  2.165  4.834  4.615
    part_cadre_profintellec_nbemploi -0.275  1.441  3.490 10.915  1.405  1.155
    =======
    perc_log_vac                     -0.128  0.000                            
    med_niveau_vis                    0.375 -3.793  0.000                     
    perc_maison                      -2.025  0.579  0.896  0.000              
    perc_tiny_log                    -6.570  5.503 -2.919 -2.682  0.000       
    dens_pop                         -0.522  0.267 -1.508  3.874  1.835  0.000
    part_agri_nb_emploi              -4.473  5.730 -4.872  1.339  4.648  2.811
    part_cadre_profintellec_nbemploi  1.541 -0.770  3.745  8.122  0.606  1.269
    >>>>>>> master
                                     prt_g__ prt_c__
    prix_med                                        
    perc_log_vac                                    
    med_niveau_vis                                  
    perc_maison                                     
    perc_tiny_log                                   
    dens_pop                                        
    part_agri_nb_emploi                0.000        
    <<<<<<< HEAD
    part_cadre_profintellec_nbemploi  -3.027   0.000
    ======= part_cadre_profintellec_nbemploi -4.109 0.000 >>>>>>> master

    Etape 4 : Représenter les deux modèles :

    Voici donc la représentation des équations structurelles, représentations qui obéit à un certain nombre de codes visuels : les rectangles renvoient aux variables observées, les ellipses aux variables latentes, les doubles flèches associées aux rectangles et aux ellipses à l’erreur de chaque variable. Les couleurs vertes et rouges renvoient au signe de la corrélation et l’épaisseur à la force de la corrélation entre les variables et les facteurs.

    <<<<<<< HEAD
    semPlot::semPaths(fact_1immo, "std",
                 sizeMan = 8, sizeInt = 8, sizeLat = 8,
                 edge.label.cex=0.8,
                 fade=FALSE)

    semPlot::semPaths(fact_2immo, "std",
                 sizeMan = 8, sizeInt = 8, sizeLat = 8,
                 edge.label.cex=0.8,
                 fade=FALSE)

    =======
    semPlot::semPaths(fact_1immo, "std",
                 sizeMan = 8, sizeInt = 8, sizeLat = 8,
                 edge.label.cex=0.8,
                 fade=FALSE)

    semPlot::semPaths(fact_2immo, "std",
                 sizeMan = 8, sizeInt = 8, sizeLat = 8,
                 edge.label.cex=0.8,
                 fade=FALSE)

    >>>>>>> master

    Etape 5 : Comparer nos deux modèles

    Tout notre enjeu ici va être de comparer les deux modèles et de choisir celui qui s’ajuste le mieux à nos données. Pour ce faire nous pouvons comparer les deux modèles sur différents indices.

    <<<<<<< HEAD
    # Pour comparer les modèles à l'aide des indices tel que l'AIC, le RMSEA, R2...
    performance::compare_performance(fact_1immo, fact_2immo, verbose = FALSE)
    =======
    # Pour comparer les modèles à l'aide des indices tel que l'AIC, le RMSEA, R2...
    performance::compare_performance(fact_1immo, fact_2immo, verbose = FALSE)
    >>>>>>> master
    # Comparison of Model Performance Indices
    
    Name       |  Model |    Chi2 | Chi2_df | p (Chi2) | Baseline(28) | p (Baseline) |   GFI |  AGFI |   NFI |  NNFI |   CFI | RMSEA |    RMSEA  CI | p (RMSEA) |   RMR |  SRMR |   RFI |  PNFI |   IFI |   RNI | Loglikelihood |   AIC (weights) |   BIC (weights) | BIC_adjusted
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    <<<<<<< HEAD
    fact_1immo | lavaan | 883.002 |  20.000 |   < .001 |     2800.713 |       < .001 | 0.727 | 0.509 | 0.685 | 0.564 | 0.689 | 0.266 | [0.25, 0.28] |    < .001 | 0.111 | 0.124 | 0.559 | 0.489 | 0.690 | 0.689 |     -5655.633 | 11343.3 (<.001) | 11413.9 (<.001) |    11363.111
    fact_2immo | lavaan | 356.542 |  19.000 |   < .001 |     2800.713 |       < .001 | 0.875 | 0.764 | 0.873 | 0.821 | 0.878 | 0.171 | [0.16, 0.19] |    < .001 | 0.064 | 0.069 | 0.812 | 0.592 | 0.879 | 0.878 |     -5392.403 | 10818.8 (>.999) | 10893.9 (>.999) |    10839.891
    # Une autre manière de visualiser très utile.
    effectsize::interpret(fact_1immo)
        Name     Value Threshold Interpretation
    1    GFI 0.7273569      0.95           poor
    2   AGFI 0.5092424      0.90           poor
    3    NFI 0.6847225      0.90           poor
    4   NNFI 0.5642526      0.90           poor
    5    CFI 0.6887519      0.90           poor
    6  RMSEA 0.2657482      0.05           poor
    7   SRMR 0.1236643      0.08           poor
    8    RFI 0.5586115      0.90           poor
    9   PNFI 0.4890875      0.50           poor
    10   IFI 0.6896473      0.90           poor
    effectsize::interpret(fact_2immo)
        Name      Value Threshold Interpretation
    1    GFI 0.87525560      0.95           poor
    2   AGFI 0.76364220      0.90           poor
    3    NFI 0.87269600      0.90           poor
    4   NNFI 0.82059800      0.90           poor
    5    CFI 0.87826293      0.90           poor
    6  RMSEA 0.17051654      0.05           poor
    7   SRMR 0.06949247      0.08   satisfactory
    8    RFI 0.81239411      0.90           poor
    9   PNFI 0.59218657      0.50   satisfactory
    10   IFI 0.87865680      0.90           poor
    ======= fact_1immo | lavaan | 923.457 | 20.000 | < .001 | 3084.675 | < .001 | 0.720 | 0.496 | 0.701 | 0.586 | 0.704 | 0.272 | [0.26, 0.29] | < .001 | 0.111 | 0.118 | 0.581 | 0.500 | 0.705 | 0.704 | -5561.143 | 11154.3 (<.001) | 11224.9 (<.001) | 11174.131 fact_2immo | lavaan | 340.107 | 19.000 | < .001 | 3084.675 | < .001 | 0.877 | 0.767 | 0.890 | 0.845 | 0.895 | 0.166 | [0.15, 0.18] | < .001 | 0.065 | 0.068 | 0.838 | 0.604 | 0.895 | 0.895 | -5269.468 | 10572.9 (>.999) | 10648.0 (>.999) | 10594.021
    # Une autre manière de visualiser très utile.
    effectsize::interpret(fact_1immo)
        Name     Value Threshold Interpretation
    1    GFI 0.7200403      0.95           poor
    2   AGFI 0.4960726      0.90           poor
    3    NFI 0.7006307      0.90           poor
    4   NNFI 0.5862040      0.90           poor
    5    CFI 0.7044314      0.90           poor
    6  RMSEA 0.2719056      0.05           poor
    7   SRMR 0.1177550      0.08           poor
    8    RFI 0.5808829      0.90           poor
    9   PNFI 0.5004505      0.50   satisfactory
    10   IFI 0.7052030      0.90           poor
    effectsize::interpret(fact_2immo)
        Name      Value Threshold Interpretation
    1    GFI 0.87694308      0.95           poor
    2   AGFI 0.76683953      0.90           poor
    3    NFI 0.88974294      0.90           poor
    4   NNFI 0.84518779      0.90           poor
    5    CFI 0.89494886      0.90           poor
    6  RMSEA 0.16631354      0.05           poor
    7   SRMR 0.06752027      0.08   satisfactory
    8    RFI 0.83751591      0.90           poor
    9   PNFI 0.60375414      0.50   satisfactory
    10   IFI 0.89525726      0.90           poor
    >>>>>>> master

    Dans les deux configurations testées, l’analyse factorielle confirmatoire présente un ajustement des modèles aux jeux de données “test” plutôt mauvais. Pour le deuxième modèle toutefois, 2 indices sont considérés comme satisfaisants et 3 indices ont des valeurs très proches <<<<<<< HEAD des seuils (NFI : 0.8853; CFI : 0.8904 ; IFI : 0.8907). Ces indices indiquent l’écart entre un modèle nul (rien n’est lié) et un modèle saturé (tout est lié avec des coefficients à 1). Le fait que ces indices aient des valeurs de 0.88 ou 0.89 et non de 0.90 n’est pas ======= des seuils (NFI : 0.8669; CFI : 0.8720 ; IFI : 0.8724). Ces indices indiquent l’écart entre un modèle nul (rien n’est lié) et un modèle saturé (tout est lié avec des coefficients à 1). Le fait que ces indices aient des valeurs de 0.86 ou 0.87 et non de 0.90 n’est pas >>>>>>> master particulièrement problématique.

    Concrètement, le deuxième modèle testé, avec 2 facteurs latents permettrait de mieux rendre compte de la complexité de nos données. Celui-ci s’ajustant le mieux à nos données.

    Le package Lavaan, fait également quelques propositions pour améliorer notre modèle. Théoriquement, en tenant compte de toutes ces propositions, le modèle s’ajusterait parfaitment, mais on serait dans un cas évident de sur-ajustement aux données. En revanche, cela peut être intéressant d’en prendre connaissance afin de vérifier qu’aucune relation n’ait été oubliée et qui permettrait d’améliorer significativement le modèle. Cette relation doit bien évidemment faire sens théoriquement. La syntaxe utilisée est celle du package lavaan, on peut en trouver une traduction ici

    <<<<<<< HEAD
    modindices(fact_1immo) %>% arrange(-mi) %>% head(20)
                       lhs op                              rhs      mi    epc
    1             prix_med ~~                     perc_log_vac 284.482 -0.457
    2             prix_med ~~                   med_niveau_vis 148.482  0.317
    3         perc_log_vac ~~                    perc_tiny_log 132.182  0.257
    4             prix_med ~~                    perc_tiny_log  96.378 -0.188
    5          perc_maison ~~ part_cadre_profintellec_nbemploi  79.007  0.166
    6        perc_tiny_log ~~                   med_niveau_vis  75.760 -0.186
    7         perc_log_vac ~~                   med_niveau_vis  70.752 -0.268
    8        perc_tiny_log ~~                         dens_pop  49.218  0.107
    9        perc_tiny_log ~~ part_cadre_profintellec_nbemploi  45.506  0.124
    10            prix_med ~~                      perc_maison  42.846 -0.135
    11            dens_pop ~~              part_agri_nb_emploi  31.546  0.112
    12         perc_maison ~~                    perc_tiny_log  30.445 -0.104
    13            dens_pop ~~                   med_niveau_vis  23.428 -0.098
    14            prix_med ~~ part_cadre_profintellec_nbemploi  19.414 -0.084
    15        perc_log_vac ~~ part_cadre_profintellec_nbemploi  14.426  0.086
    16            prix_med ~~                         dens_pop  14.313 -0.066
    17            dens_pop ~~ part_cadre_profintellec_nbemploi  13.468  0.056
    18         perc_maison ~~                   med_niveau_vis  11.288  0.079
    19      med_niveau_vis ~~ part_cadre_profintellec_nbemploi   9.536  0.067
    20 part_agri_nb_emploi ~~ part_cadre_profintellec_nbemploi   9.182 -0.066
       sepc.lv sepc.all sepc.nox
    1   -0.457   -0.724   -0.724
    2    0.317    0.522    0.522
    3    0.257    0.562    0.562
    4   -0.188   -0.520   -0.520
    5    0.166    0.516    0.516
    6   -0.186   -0.424   -0.424
    7   -0.268   -0.348   -0.348
    8    0.107    0.390    0.390
    9    0.124    0.455    0.455
    10  -0.135   -0.316   -0.316
    11   0.112    0.256    0.256
    12  -0.104   -0.337   -0.337
    13  -0.098   -0.211   -0.211
    14  -0.084   -0.225   -0.225
    15   0.086    0.180    0.180
    16  -0.066   -0.174   -0.174
    17   0.056    0.195    0.195
    18   0.079    0.152    0.152
    19   0.067    0.146    0.146
    20  -0.066   -0.153   -0.153
    modindices(fact_2immo) %>% arrange(-mi) %>% head(20)
                       lhs op                              rhs     mi    epc
    1                   F1 =~                      perc_maison 91.820 -0.303
    2             prix_med ~~                      perc_maison 72.182 -0.121
    3          perc_maison ~~ part_cadre_profintellec_nbemploi 62.761  0.148
    4       med_niveau_vis ~~ part_cadre_profintellec_nbemploi 58.246  0.141
    5                   F1 =~                    perc_tiny_log 56.384 -0.209
    6         perc_log_vac ~~                    perc_tiny_log 31.105  0.085
    7       med_niveau_vis ~~                      perc_maison 26.145  0.105
    8             dens_pop ~~              part_agri_nb_emploi 25.670  0.100
    9  part_agri_nb_emploi ~~ part_cadre_profintellec_nbemploi 19.694 -0.097
    10       perc_tiny_log ~~              part_agri_nb_emploi 18.027  0.089
    11            prix_med ~~ part_cadre_profintellec_nbemploi 16.107 -0.052
    12       perc_tiny_log ~~                         dens_pop 14.588  0.057
    13                  F2 =~                         prix_med 12.875 -0.245
    14        perc_log_vac ~~                   med_niveau_vis 12.875 -0.103
    15                  F1 =~              part_agri_nb_emploi 12.058 -0.139
    16            prix_med ~~                   med_niveau_vis 11.464 -0.144
    17                  F2 =~                     perc_log_vac 11.463 -0.159
    18      med_niveau_vis ~~              part_agri_nb_emploi 10.530 -0.086
    19         perc_maison ~~                         dens_pop 10.252  0.051
    20      med_niveau_vis ~~                    perc_tiny_log  9.682 -0.053
       sepc.lv sepc.all sepc.nox
    1   -0.303   -0.312   -0.312
    2   -0.121   -0.661   -0.661
    3    0.148    0.451    0.451
    4    0.141    0.337    0.337
    5   -0.209   -0.219   -0.219
    6    0.085    0.275    0.275
    7    0.105    0.218    0.218
    8    0.100    0.229    0.229
    9   -0.097   -0.217   -0.217
    10   0.089    0.247    0.247
    11  -0.052   -0.326   -0.326
    12   0.057    0.253    0.253
    13  -0.245   -0.262   -0.262
    14  -0.103   -0.183   -0.183
    15  -0.139   -0.134   -0.134
    16  -0.144   -0.613   -0.613
    17  -0.159   -0.162   -0.162
    18  -0.086   -0.132   -0.132
    19   0.051    0.159    0.159
    20  -0.053   -0.156   -0.156

    6.2 2ème exemple : étudier la variation dans le temps d’un modèle

    Un usage pertinent du couple AFE/AFC peut être d’étudier la permanence d’un phénomène. Ainsi, on peut utiliser l’AFE dans un premier temps pour faire émerger un modèle et vérifier dans un second temps avec l’analyse factorielle confirmatoire si le modèle est resté le même.

    Dans cet article, nous venons de mettre en pratique le couple AFE/AFC dans le cadre d’une première approche afin de sélectionner le meilleur modèle factoriel. Voyons à présent si un modèle produit à l’aide d’une AFE, sur des données de 2011, se confirme sur des données de 2023. Ceci nous permettra de mettre en évidence ou non la permanence des phénomènes en présence.

    Nous utiliserons des données issue de l’INED dans un premier temps sur le cru 2011

    • PAYS : Les différents pays du monde
    • Superf : Superficie des différents pays en km²
    • Pop : Nombre d’habitants en 2011
    • tx_natalite : Le taux de natalité est le rapport du nombre de naissances vivantes de l’année à la population totale moyenne de l’année
    • tx_mortalite : Le taux de mortalité est le rapport du nombre de décès de l’année à la population totale moyenne de l’année
    • pop2050 : Projection du nombre d’habitants en 2050
    • tx_mort_infantile : Nombre de décès d’enfants de moins d’un an rapporté au nombre de naissances vivantes
    • indice_fecond : Le nombre d’enfants nés vivants des femmes d’un âge donné (ou d’une tranche d’âge) au cours de l’année, rapporté à la population moyenne de l’année des femmes de même âge (ou de la même classe d’âge) indique le taux de fécondité. L’indice de fécondité est la somme des taux de fécondité par âge d’une année.
    • moins15 : Le nombre d’habitants de moins de 15 ans
    • plus65 : Le nombre d’habitants de plus de 65 ans
    • espvie_homme : Age moyen de décès atteint par les hommes en 2011
    • espvie_femme : Age moyen de décès atteint par les femmes en 2011
    • RNB_hab : Revenu National Brut rapporté au nombre d’habitants

    6.2.1 Préparation des données

    library(here)
    csv_path <- here("data", "pop_societe_2011.csv")
    
    pop2011 <- read.csv2(csv_path, row.names=1)
    
    ### Centrer et réduire les variables
    dfz_2011 <-  data.frame(scale(pop2011, center=T, scale=T))

    Nous ne présenterons pas les statistiques descriptives dans cet exemple afin de ne pas allourdir la lecture de cet article, toutefois, elles ont bien été vérifiées par les auteurs.

    Vérification des outliers et de la multicolinéarité : Nous faisons le choix ici d’être plus stricte concernant les outliers et les variables multicolinéaires. Cela comme précédemment, doit être assumé et justifié lors de l’analyse.

    6.2.2 Nettoyage des données

    Etape 1 : les outliers

    # Multioutliers
    #MCD avec le package rrcov
    library(rrcov)
    # 1- calcul de la distance MCD
    mcd_result_2011 <- CovMcd(dfz_2011, alpha=0.75)
    
    # 2- visualisation des outliers
    plot(mcd_result_2011, which="all")

    # suppression des valeurs manquantes
    dfz_2011out<-cbind(dfz_2011, mcd_result_2011$wt)
    dfz_2011outp<-subset(dfz_2011out, mcd_result_2011$wt %in% c(0,1))
    
    # fusion de la base initiale et des distances de mahalanobis robustes
    dfz_2011mah<-cbind(dfz_2011outp, mcd_result_2011$raw.mah)
    
    # 3- suppression des outliers
    dfz_2011p<-subset(dfz_2011mah, dfz_2011mah$`mcd_result_2011$raw.mah`< 100)
    
    # On recalcule la distance de mahalanobis robuste sur notre base de données sans les premiers outliers, pour voir s'il en reste
    dfz_2011_B<-subset(dfz_2011p, select = -c(`mcd_result_2011$raw.mah`, `mcd_result_2011$wt`))
    # 1- calcul de la distance MCD
    mcd_result_2011_2 <- CovMcd(dfz_2011_B, alpha=0.75)
    # L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
    # 2- visualisation des outliers
    plot(mcd_result_2011_2, which="all")

    15 outliers ont été supprimé avec le calcul de la distance de mahalanobis robuste. La suppression des outliers a été réalisée suite au calcul de la distance de mahalanobis robuste où le seuil de 100 comprend les valeurs les plus éloignées. L’objectif est de sortir de l’analyse les individus statistiques les plus porteurs de biais, néanmoins pour conserver du sens dans notre base de données nous ne supprimons pas tous les outliers relevé par la fonction, d’où le choix du seuil de 100. Ce seuil a été déterminé suite à différentes itérations sur notre jeux de données. Il sera donc différent avec d’autres données.

    A présent aucune observation ne semble se détacher fortement des autres. Notre base de données compte maintenant 158 pays (sans la Chine, l’Inde, les Etats-Unis, le Canada, l’Australie, la Russie et bien d’autres…).

    Etape 2 : la multicolinéarité

    # corrélations
    
    cor <- correlation(dfz_2011_B, method = "spearman")
    
    cor %>%
      summary(redundant = FALSE)
    # Correlation Matrix (spearman-method)
    
    Parameter         |  RNB_hab | espvie_femme | espvie_homme |   plus65 | moins15 | indice_fecond | tx_mort_infantile | pop2050 | tx_mortalite | tx_natalite |     Pop
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Superf            |    -0.20 |       -0.25* |        -0.24 |    -0.20 |    0.24 |         0.27* |             0.27* | 0.77*** |         0.14 |       0.27* | 0.74***
    Pop               |    -0.09 |        -0.04 |        -0.05 |    -0.02 |    0.07 |          0.07 |              0.07 | 0.98*** |         0.09 |        0.07 |        
    tx_natalite       | -0.83*** |     -0.86*** |     -0.77*** | -0.92*** | 0.97*** |       0.98*** |           0.89*** |   0.25* |         0.13 |             |        
    tx_mortalite      |    -0.22 |     -0.38*** |     -0.51*** | 6.83e-03 |    0.10 |          0.16 |             0.27* |    0.12 |              |             |        
    pop2050           |    -0.23 |        -0.18 |        -0.18 |    -0.19 |    0.24 |         0.25* |              0.23 |         |              |             |        
    tx_mort_infantile | -0.87*** |     -0.94*** |     -0.89*** | -0.85*** | 0.90*** |       0.86*** |                   |         |              |             |        
    indice_fecond     | -0.80*** |     -0.83*** |     -0.74*** | -0.89*** | 0.96*** |               |                   |         |              |             |        
    moins15           | -0.84*** |     -0.84*** |     -0.76*** | -0.91*** |         |               |                   |         |              |             |        
    plus65            |  0.77*** |      0.84*** |      0.74*** |          |         |               |                   |         |              |             |        
    espvie_homme      |  0.82*** |      0.94*** |              |          |         |               |                   |         |              |             |        
    espvie_femme      |  0.85*** |              |              |          |         |               |                   |         |              |             |        
    
    p-value adjustment method: Holm (1979)
    ### Etude du VIF
    
    vifstep(dfz_2011_B, method = "spearman")
    5 variables from the 12 input variables have collinearity problem: 
     
    tx_natalite espvie_homme espvie_femme moins15 pop2050 
    
    After excluding the collinear variables, the linear correlation coefficients ranges between: 
    min correlation ( plus65 ~ tx_mortalite ):  0.006826529 
    max correlation ( plus65 ~ indice_fecond ):  -0.8874719 
    
    ---------- VIFs of the remained variables -------- 
              Variables      VIF
    1            Superf 1.502763
    2               Pop 1.423677
    3      tx_mortalite 4.108345
    4 tx_mort_infantile 8.688467
    5     indice_fecond 4.762499
    6            plus65 6.947084
    7           RNB_hab 2.292747
    dfz2011_multi <- dfz_2011_B %>% select(-tx_natalite, -espvie_homme, -pop2050, -moins15, -tx_mortalite, -espvie_femme )
    vifstep(dfz2011_multi, method = "spearman")
    No variable from the 6 input variables has collinearity problem. 
    
    The linear correlation coefficients ranges between: 
    min correlation ( plus65 ~ Pop ):  -0.0172211 
    max correlation ( plus65 ~ indice_fecond ):  -0.8874719 
    
    ---------- VIFs of the remained variables -------- 
              Variables      VIF
    1            Superf 1.500557
    2               Pop 1.405872
    3 tx_mort_infantile 4.279781
    4     indice_fecond 4.749530
    5            plus65 2.757888
    6           RNB_hab 2.078991
    # Après suppression des variables colinéaires, notre jeu de données en compte 6.

    6.2.3 Réaliser l’AFE sur les données 2011

    Etape 1 : Déterminer le nombre de facteurs

    # Regardons à présent en combien de facteurs latents se structurent nos variables
    n <- n_factors(dfz2011_multi)
    n
    # Method Agreement Procedure:
    
    The choice of 2 dimensions is supported by 8 (50.00%) methods out of 16 (Optimal coordinates, Acceleration factor, Parallel analysis, Kaiser criterion, Scree (SE), VSS complexity 1, BIC, BIC (adjusted)).
    library(see)
    plot(n) + theme_modern()

    # Les méthodes suggèrent 2 facteurs

    Etape 2 : Vérifier le KMO et la sphéracité

    performance::check_factorstructure(dfz2011_multi)
    # Is the data suitable for Factor Analysis?
    
    
      - Sphericity: Bartlett's test of sphericity suggests that there is sufficient significant correlation in the data for factor analysis (Chisq(15) = 504.50, p < .001).
      - KMO: The Kaiser, Meyer, Olkin (KMO) overall measure of sampling adequacy suggests that data seems appropriate for factor analysis (KMO = 0.72). The individual KMO scores are: Superf (0.56), Pop (0.45*), tx_mort_infantile (0.73), indice_fecond (0.72), plus65 (0.80), RNB_hab (0.82).
    # Nos données sont factorisables

    Etape 3 : Réaliser l’AFE

    # efa
    efa_2011 <- lavaan::efa(dfz2011_multi, nfactors = 2, rotation="promax", estimator="MLR")
    efa_2011
    
                          f1     f2
    Superf             0.988       
    Pop                0.533      .
    tx_mort_infantile         0.903
    indice_fecond             0.945
    plus65                   -0.759
    RNB_hab                  -0.668

    Nous avons donc deux facteurs latents. Un premier qui corrèle positivement avec la surface et la population, et un deuxième facteur latent qui oppose d’un côté score élevé sur la mortalité infantile et indice de fécondité avec de l’autre la proportion d’habitant de plus de 65 ans et et le revenu national brut par habitant.

    6.2.4 2ème temps L’analyse factorielle confirmatoire

    Testons si la structure factorielle obtenue grâce à l’AFE se retrouve sur les données de 2023. Si c’est le cas cela implique une permanence en 2023 du phénomène étudié en 2011.

    Etape 1 : Chargement et préparation des données

    # Charger les données
    
    library(here)
    csv_path <- here("data", "data_monde_afe_02.csv")
    
    pop2023 <- read.csv2(csv_path, row.names=1)
    
    pop2023p<-subset(pop2023, select = c(Superf, Pop, tx_mort_infantile, indice_fecond, RNB_hab, plus65))
    
    ### Centrer et réduire les variables
    dfz_2023 <-  data.frame(scale(pop2023p, center=T, scale=T))
    
    
    # Multioutliers
    # MCD avec le package rrcov
    library(rrcov)
    # 1- calcul de la distance MCD
    mcd_result_2023 <- CovMcd(dfz_2023, alpha=0.75)
    # L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
    # 2- visualisation des outliers
    plot(mcd_result_2023, which="all")

    # suppression des valeurs manquantes
    dfz_2023out<-cbind(dfz_2023, mcd_result_2023$wt)
    dfz_2023outp<-subset(dfz_2023out, mcd_result_2023$wt %in% c(0,1))
    
    # fusion de la base initiale et des distances de mahalanobis robustes
    dfz_2023mah<-cbind(dfz_2023outp, mcd_result_2023$raw.mah)
    
    # 3- suppression des outliers
    dfz_2023p<-subset(dfz_2023mah, dfz_2023mah$`mcd_result_2023$raw.mah`< 100)
    
    # On recalcule la distance de mahalanobis robuste sur notre base de données sans les premiers outliers, pour voir s'il en reste
    dfz_2023_B<-subset(dfz_2023p, select = -c(`mcd_result_2023$raw.mah`, `mcd_result_2023$wt`))
    # 1- calcul de la distance MCD
    mcd_result_2023_2 <- CovMcd(dfz_2023_B, alpha=0.75)
    # L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
    # 2- visualisation des outliers
    plot(mcd_result_2023_2, which="all")

    # 14 outliers ont été supprimé avec le calcul de la distance de mahalanobis robuste. A présent aucune observation semble se détacher fortement des autres. Notre base de données compte maintenant 158 pays (sans la Chine, l'Inde, les Etats-Unis, le Canada, l'Australie, la Russie et bien d'autres...)

    Globalement on retrouve les même outliers principaux (Chine, Russie, Inde, Canada, Etats-Unis) avec malgré tout quelques variations. Pour étudier la permanence dans le temps de notre phénomène nous avons donc gardé les même variables qu’en 2011 pour permettre une comparaison entre ces deux années.

    Etape 2 : Réaliser la CFA

    ### Attacher car R refuse les $
    attach(dfz_2023_B)
    
    model23 <- 'F1 =~ Superf + Pop
               F2 =~ indice_fecond + plus65 + RNB_hab'
    
    library(lavaan)
    
    fit23 <- cfa(model23, std.lv=T, estimator="MLR", data=dfz_2023_B)
    
    
    effectsize::interpret(fit23)
        Name      Value Threshold Interpretation
    1    GFI 0.96617198      0.95   satisfactory
    2   AGFI 0.87314492      0.90           poor
    3    NFI 0.95803658      0.90   satisfactory
    4   NNFI 0.92359123      0.90   satisfactory
    5    CFI 0.96943649      0.90   satisfactory
    6  RMSEA 0.12442816      0.05           poor
    7   SRMR 0.04451438      0.08   satisfactory
    8    RFI 0.89509145      0.90           poor
    9   PNFI 0.38321463      0.50           poor
    10   IFI 0.97000943      0.90   satisfactory
    semPlot::semPaths(fit23, "std",
                 sizeMan = 8, sizeInt = 8, sizeLat = 8,
                 edge.label.cex=0.8,
                 fade=FALSE)

    Les indices de la CFA sont satisfaisants (6 sur 10, et 2 sont proches des seuils), ce qui traduit une bonne adéquation du modèle à nos données. La structure testée en 2011 sur certains pays se retrouve bien en 2023. La distinction entre les pays étudiés se structure selon 2 facteurs : la superficie et la population d’une part et l’indice de fécondité et la part des plus de 65 ans dans la population ainsi que le RNB. Il est à noter que ce deuxième facteur rassemble des indices contraires, c’est-à-dire que les pays ayant un fort taux de fécondité sont aussi ceux qui ont une part des plus de 65 ans dans leur population faible et un RNB bas.

    Si les résultats ne sont pas révolutionnaires et que le nettoyage préliminaire ne permet pas de leur attribuer une portée générale, nous avons toutefois pu observer que le duo analyse factorielle exploratoire et analyse factorielle confirmatoire permet de rendre compte de la stabilité d’une structure d’un modèle théorique dans le temps.

    6.3 Est-ce que je mesure bien ce que je pense mesurer : l’exemple des tests psychométriques en Psychologie

    En Psychologie, un exemple classique de l’utilisation des couples AFE/AFC concerne la validation des tests psychométriques. Afin de réaliser des tests standardisés pour évaluer des processus psychologiques, les psychologues ont recours à ce couple d’analyses factorielles, en réalisant une analyse factorielle exploratoire sur un premier échantillon et une analyse factorielle confirmatoire sur un second échantillon (ayant tous 2 les mêmes caractéristiques).

    Nous allons illustrer notre démarche avec l’utilisation d’un outil psychométrique le Revised Paranormal Beliefs Scale - RPBS à partir des données issues de l’article de Pennycook G, et al. 2020.

    Le RPBS est un outil psychométrique utilisé afin de mesurer la croyance des individus dans des phénomènes paranormaux. Habituellement composé de 26 items répartis en 7 facteurs, la version utilisée dans l’article présenté se décompose en 22 variables répartis en 6 facteurs latents. Le facteur correspondant aux croyances religieuses traditionnelles ayant été sorti de l’outil, avec les variables qui le composent.

    Les variables de notre base de données se répartissent comme ceci, un exemple d’intitulé de variable est présenté entre parenthèses pour chaque facteur :

    • Phénomènes parapsychologiques (“Lire dans les pensées est possible”) : PB_1, PB_7, PB_13, PB_19
    • Sorcellerie (“Les sorciers existent”) : PB_2, PB_8, PB_14, PB_20
    • Superstition (“Les chats noirs portent malheur”) : PB_3, PB_9, PB_15
    • Spiritualité (“Il est possible de communiquer avec les morts”) : PB_4, PB_10, PB_16, PB_21
    • Formes de vie extraordinaires (“Le monstre du Loch Ness existe”) : PB_5, PB_11, PB_17
    • Précognition (“L’astrologie est une voie pertinente pour prédire le futur”) : PB_6, PB_12, PB_18, PB_22

    6.3.1 Préparation du jeu de données

    Charger le jeu de données et standardiser les variables d’intérêt.

    # Chargement des données de base
    
    library(here)
    csv_path <- here("data", "Study3_RPB.csv")
    
    RPB <- read.csv2(csv_path, row.names=1)
    
    # Sélection des 22 items : 
    
    RPBp<-subset(RPB, select = c("PB_1", "PB_2", "PB_3", "PB_4", "PB_5", "PB_6", "PB_7" ,"PB_8", "PB_9", "PB_10", "PB_11", "PB_12", "PB_13", "PB_14", "PB_15", "PB_16", "PB_17", "PB_18", "PB_19", "PB_20", "PB_21", "PB_22"))
    
    # Conversion des variables en format numérique (car elles sont considérées comme catégorielles)
    RPBpn <- as.data.frame(lapply(RPBp, as.numeric))

    Nous allons débuter par partitionner notre jeu de données pour ne pas exécuter l’AFE et l’AFC sur le même échantillon.

    ## En premier lien le partitionnement des data
    partitions <- datawizard::data_partition(RPBpn, proportion = 0.5, seed = 424)
    training <- partitions$p_0.5
    test <- partitions$test
    
    training$.row_id <- NULL
    test$.row_id <- NULL
    
    ### Centrer et réduire les variables de nos 2 jeux de données
    trainingz <-  na.omit(data.frame(scale(training, center=T, scale=T)))
    testz <-  na.omit(data.frame(scale(test, center=T, scale=T)))

    Nous avons vérifié les statistiques descriptives sur notre jeu de données. Nous ne les présentons pas dans cet exemple pour plus de lisibilité. Il est toutefois à noter qu’il n’y a pas de différence statistiquement significative des scores obtenus sur chaque variable pour nos deux échantillons training et test.

    6.3.2 Nettoyage des données

    Etape 1 : les outliers

    Identification et suppression des outliers sur nos deux jeux de données test et training.

    Multioutliers base training

    # Multioutliers base training
    #MCD avec le package rrcov
    library(rrcov)
    # 1- calcul de la distance MCD
    mcd_RPBS1 <- CovMcd(trainingz, alpha=0.75)
    # L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
    # 2- visualisation des outliers
    #plot(mcd_RPBS1, which="all")
    
    # suppression des valeurs manquantes
    trainingzout<-cbind(trainingz, mcd_RPBS1$wt)
    trainingzoutp<-subset(trainingzout, mcd_RPBS1$wt %in% c(0,1))
    
    # fusion de la base initiale et des distances de mahalanobis robustes
    trainingzmah<-cbind(trainingzoutp, mcd_RPBS1$raw.mah)
    
    # 3- suppression des outliers
    trainingzp<-subset(trainingzmah, trainingzmah$`mcd_RPBS1$raw.mah`< 100)
    
    # On recalcule la distance de mahalanobis robuste sur notre base de données sans les premiers outliers, pour voir s'il en reste
    trainingz_B<-subset(trainingzp, select = -c(`mcd_RPBS1$raw.mah`, `mcd_RPBS1$wt`))
    # 1- calcul de la distance MCD
    mcd_RPBS1_2 <- CovMcd(trainingz_B, alpha=0.75)
    # L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
    # 2- visualisation des outliers
    #plot(mcd_RPBS1_2, which="all")

    Multioutliers base test

    # Multioutliers base test
    #MCD avec le package rrcov
    
    # 1- calcul de la distance MCD
    mcd_RPBS2 <- CovMcd(testz, alpha=0.75)
    # L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
    # 2- visualisation des outliers
    #plot(mcd_RPBS2, which="all")
    
    # suppression des valeurs manquantes
    testzout<-cbind(testz, mcd_RPBS2$wt)
    testzoutp<-subset(testzout, mcd_RPBS2$wt %in% c(0,1))
    
    # fusion de la base initiale et des distances de mahalanobis robustes
    testzmah<-cbind(testzoutp, mcd_RPBS2$raw.mah)
    
    # 3- suppression des outliers
    testzp<-subset(testzmah, testzmah$`mcd_RPBS2$raw.mah`< 100)
    
    # On recalcule la distance de mahalanobis robuste sur notre base de données sans les premiers outliers, pour voir s'il en reste
    testz_B<-subset(testzp, select = -c(`mcd_RPBS2$raw.mah`, `mcd_RPBS2$wt`))
    # 1- calcul de la distance MCD
    mcd_RPBS2_2 <- CovMcd(testz_B, alpha=0.75)
    # L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
    # 2- visualisation des outliers
    #plot(mcd_RPBS2_2, which="all")
    
    # Aucun sujet ne se détache du groupe avec le calcul de la distance de Mahalanobis robuste dans chacune des 2 bases de données testées après les premières suppression. Nous ne supprimons pas de valeurs supplémentaires.

    Notre jeu de données training comportait 6 outliers et le jeu de données test en comportait 10. Nous les avons donc supprimés. Tout comme l’exemple précédent, les outliers entrainant le plus de biais ont été supprimés de notre jeu de données. Le seuil de 100 a également été retenu suite à différentes itérations du calcul de la distance de Mahalanobis robuste.

    Etape 2 : la multicolinéarité

    # corrélations
    
    cor <- correlation(trainingz_B, method = "spearman")
    
    cor %>%
      summary(redundant = FALSE)
    # Correlation Matrix (spearman-method)
    
    Parameter |   PB_22 |   PB_21 |   PB_20 |   PB_19 |   PB_18 |   PB_17 |   PB_16 |   PB_15 |   PB_14 |   PB_13 |   PB_12 |   PB_11 |   PB_10 |    PB_9 |    PB_8 |    PB_7 |    PB_6 |    PB_5 |    PB_4 |    PB_3 |    PB_2
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    PB_1      | 0.59*** | 0.55*** | 0.46*** | 0.63*** | 0.61*** | 0.38*** | 0.44*** | 0.40*** | 0.64*** | 0.81*** | 0.48*** | 0.49*** | 0.61*** | 0.41*** | 0.47*** | 0.76*** | 0.51*** | 0.55*** | 0.62*** | 0.35*** | 0.54***
    PB_2      | 0.52*** | 0.43*** | 0.72*** | 0.43*** | 0.44*** | 0.28*** | 0.32*** | 0.23*** | 0.56*** | 0.53*** | 0.32*** | 0.35*** | 0.48*** | 0.21*** | 0.68*** | 0.53*** | 0.35*** | 0.34*** | 0.46*** |   0.14* |        
    PB_3      |  0.19** | 0.28*** |   0.12* | 0.32*** | 0.29*** |   0.14* | 0.30*** | 0.66*** | 0.42*** | 0.34*** | 0.49*** | 0.28*** | 0.29*** | 0.69*** |    0.09 | 0.26*** | 0.49*** | 0.34*** | 0.21*** |         |        
    PB_4      | 0.64*** | 0.64*** | 0.43*** | 0.57*** | 0.57*** | 0.52*** | 0.56*** | 0.30*** | 0.52*** | 0.66*** | 0.42*** | 0.41*** | 0.72*** | 0.32*** | 0.37*** | 0.59*** | 0.49*** | 0.43*** |         |         |        
    PB_5      | 0.33*** | 0.36*** | 0.33*** | 0.49*** | 0.35*** | 0.32*** | 0.31*** | 0.37*** | 0.45*** | 0.53*** | 0.39*** | 0.62*** | 0.35*** | 0.42*** | 0.36*** | 0.46*** | 0.44*** |         |         |         |        
    PB_6      | 0.48*** | 0.55*** | 0.37*** | 0.53*** | 0.61*** | 0.40*** | 0.56*** | 0.56*** | 0.55*** | 0.54*** | 0.81*** | 0.44*** | 0.51*** | 0.59*** | 0.29*** | 0.50*** |         |         |         |         |        
    PB_7      | 0.59*** | 0.52*** | 0.50*** | 0.59*** | 0.59*** | 0.43*** | 0.47*** | 0.32*** | 0.59*** | 0.72*** | 0.43*** | 0.38*** | 0.58*** | 0.35*** | 0.47*** |         |         |         |         |         |        
    PB_8      | 0.44*** | 0.35*** | 0.74*** | 0.40*** | 0.37*** | 0.22*** | 0.23*** |   0.15* | 0.53*** | 0.45*** | 0.25*** | 0.35*** | 0.41*** |   0.15* |         |         |         |         |         |         |        
    PB_9      | 0.22*** | 0.38*** |  0.18** | 0.39*** | 0.38*** |  0.18** | 0.37*** | 0.75*** | 0.49*** | 0.39*** | 0.64*** | 0.34*** | 0.34*** |         |         |         |         |         |         |         |        
    PB_10     | 0.60*** | 0.59*** | 0.41*** | 0.56*** | 0.58*** | 0.40*** | 0.54*** | 0.33*** | 0.53*** | 0.61*** | 0.47*** | 0.40*** |         |         |         |         |         |         |         |         |        
    PB_11     | 0.35*** | 0.37*** | 0.36*** | 0.45*** | 0.31*** | 0.39*** | 0.30*** | 0.32*** | 0.43*** | 0.45*** | 0.45*** |         |         |         |         |         |         |         |         |         |        
    PB_12     | 0.41*** | 0.44*** | 0.30*** | 0.48*** | 0.56*** | 0.29*** | 0.48*** | 0.57*** | 0.51*** | 0.52*** |         |         |         |         |         |         |         |         |         |         |        
    PB_13     | 0.60*** | 0.55*** | 0.47*** | 0.67*** | 0.55*** | 0.39*** | 0.49*** | 0.39*** | 0.65*** |         |         |         |         |         |         |         |         |         |         |         |        
    PB_14     | 0.50*** | 0.52*** | 0.54*** | 0.61*** | 0.50*** | 0.32*** | 0.42*** | 0.44*** |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_15     |  0.19** | 0.31*** |  0.18** | 0.35*** | 0.33*** |   0.14* | 0.36*** |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_16     | 0.52*** | 0.61*** | 0.29*** | 0.50*** | 0.47*** | 0.47*** |         |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_17     | 0.46*** | 0.43*** | 0.32*** | 0.43*** | 0.42*** |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_18     | 0.70*** | 0.61*** | 0.45*** | 0.63*** |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_19     | 0.61*** | 0.53*** | 0.43*** |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_20     | 0.52*** | 0.43*** |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_21     | 0.62*** |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    
    p-value adjustment method: Holm (1979)
    cor <- correlation(testz_B, method = "spearman")
    
    cor %>%
      summary(redundant = FALSE)
    # Correlation Matrix (spearman-method)
    
    Parameter |   PB_22 |   PB_21 |   PB_20 |   PB_19 |   PB_18 |   PB_17 |   PB_16 |   PB_15 |   PB_14 |   PB_13 |   PB_12 |   PB_11 |   PB_10 |    PB_9 |    PB_8 |    PB_7 |    PB_6 |    PB_5 |    PB_4 |    PB_3 |    PB_2
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    PB_1      | 0.49*** | 0.55*** | 0.46*** | 0.61*** | 0.57*** | 0.38*** | 0.51*** | 0.37*** | 0.61*** | 0.76*** | 0.50*** | 0.51*** | 0.60*** | 0.46*** | 0.41*** | 0.77*** | 0.52*** | 0.53*** | 0.59*** | 0.38*** | 0.54***
    PB_2      | 0.53*** | 0.57*** | 0.71*** | 0.56*** | 0.51*** | 0.45*** | 0.51*** | 0.35*** | 0.71*** | 0.58*** | 0.49*** | 0.44*** | 0.56*** | 0.39*** | 0.72*** | 0.58*** | 0.51*** | 0.46*** | 0.60*** | 0.28*** |        
    PB_3      | 0.22*** | 0.31*** | 0.23*** | 0.34*** | 0.37*** | 0.17*** | 0.30*** | 0.66*** | 0.42*** | 0.37*** | 0.54*** | 0.36*** | 0.30*** | 0.66*** | 0.20*** | 0.36*** | 0.46*** | 0.43*** | 0.35*** |         |        
    PB_4      | 0.58*** | 0.62*** | 0.51*** | 0.59*** | 0.58*** | 0.54*** | 0.63*** | 0.35*** | 0.61*** | 0.66*** | 0.46*** | 0.45*** | 0.78*** | 0.38*** | 0.47*** | 0.63*** | 0.52*** | 0.45*** |         |         |        
    PB_5      | 0.39*** | 0.45*** | 0.39*** | 0.47*** | 0.46*** | 0.39*** | 0.40*** | 0.41*** | 0.49*** | 0.56*** | 0.46*** | 0.68*** | 0.42*** | 0.45*** | 0.40*** | 0.56*** | 0.46*** |         |         |         |        
    PB_6      | 0.46*** | 0.59*** | 0.45*** | 0.53*** | 0.57*** | 0.38*** | 0.54*** | 0.49*** | 0.58*** | 0.57*** | 0.75*** | 0.43*** | 0.55*** | 0.54*** | 0.42*** | 0.54*** |         |         |         |         |        
    PB_7      | 0.55*** | 0.57*** | 0.49*** | 0.66*** | 0.61*** | 0.44*** | 0.50*** | 0.41*** | 0.65*** | 0.79*** | 0.53*** | 0.55*** | 0.62*** | 0.47*** | 0.43*** |         |         |         |         |         |        
    PB_8      | 0.53*** | 0.49*** | 0.73*** | 0.47*** | 0.46*** | 0.36*** | 0.46*** | 0.24*** | 0.58*** | 0.45*** | 0.35*** | 0.33*** | 0.42*** | 0.31*** |         |         |         |         |         |         |        
    PB_9      | 0.30*** | 0.42*** | 0.35*** | 0.41*** | 0.44*** | 0.21*** | 0.44*** | 0.64*** | 0.59*** | 0.47*** | 0.62*** | 0.42*** | 0.37*** |         |         |         |         |         |         |         |        
    PB_10     | 0.53*** | 0.60*** | 0.46*** | 0.60*** | 0.56*** | 0.53*** | 0.61*** | 0.33*** | 0.61*** | 0.66*** | 0.51*** | 0.42*** |         |         |         |         |         |         |         |         |        
    PB_11     | 0.36*** | 0.38*** | 0.36*** | 0.44*** | 0.44*** | 0.44*** | 0.33*** | 0.35*** | 0.56*** | 0.51*** | 0.45*** |         |         |         |         |         |         |         |         |         |        
    PB_12     | 0.43*** | 0.51*** | 0.41*** | 0.53*** | 0.57*** | 0.32*** | 0.47*** | 0.57*** | 0.59*** | 0.53*** |         |         |         |         |         |         |         |         |         |         |        
    PB_13     | 0.53*** | 0.59*** | 0.48*** | 0.69*** | 0.58*** | 0.48*** | 0.52*** | 0.39*** | 0.65*** |         |         |         |         |         |         |         |         |         |         |         |        
    PB_14     | 0.50*** | 0.57*** | 0.62*** | 0.58*** | 0.57*** | 0.45*** | 0.53*** | 0.38*** |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_15     | 0.28*** | 0.34*** | 0.26*** | 0.38*** | 0.37*** | 0.21*** | 0.32*** |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_16     | 0.55*** | 0.67*** | 0.43*** | 0.53*** | 0.56*** | 0.44*** |         |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_17     | 0.43*** | 0.43*** | 0.37*** | 0.46*** | 0.45*** |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_18     | 0.68*** | 0.59*** | 0.51*** | 0.59*** |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_19     | 0.60*** | 0.58*** | 0.46*** |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_20     | 0.55*** | 0.54*** |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    PB_21     | 0.58*** |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |         |        
    
    p-value adjustment method: Holm (1979)
    ### gestion multicolinéarité
    
    vifstep(trainingz_B, method = "spearman")
    No variable from the 22 input variables has collinearity problem. 
    
    The linear correlation coefficients ranges between: 
    min correlation ( PB_8 ~ PB_3 ):  0.09464123 
    max correlation ( PB_13 ~ PB_1 ):  0.8141815 
    
    ---------- VIFs of the remained variables -------- 
       Variables      VIF
    1       PB_1 4.560558
    2       PB_2 2.734096
    3       PB_3 2.208149
    4       PB_4 3.333450
    5       PB_5 2.135252
    6       PB_6 3.720740
    7       PB_7 3.043448
    8       PB_8 2.750028
    9       PB_9 2.994793
    10     PB_10 2.853347
    11     PB_11 2.108972
    12     PB_12 3.566169
    13     PB_13 4.093647
    14     PB_14 2.697757
    15     PB_15 2.422444
    16     PB_16 2.160766
    17     PB_17 1.693175
    18     PB_18 3.246472
    19     PB_19 2.629454
    20     PB_20 3.221506
    21     PB_21 2.485992
    22     PB_22 3.108305
    vifstep(testz_B, method = "spearman")
    No variable from the 22 input variables has collinearity problem. 
    
    The linear correlation coefficients ranges between: 
    min correlation ( PB_17 ~ PB_3 ):  0.1696088 
    max correlation ( PB_13 ~ PB_7 ):  0.7927911 
    
    ---------- VIFs of the remained variables -------- 
       Variables      VIF
    1       PB_1 3.249071
    2       PB_2 3.455955
    3       PB_3 2.302907
    4       PB_4 3.436888
    5       PB_5 2.232409
    6       PB_6 2.764499
    7       PB_7 3.908038
    8       PB_8 2.816476
    9       PB_9 2.757670
    10     PB_10 3.227192
    11     PB_11 2.229256
    12     PB_12 2.835638
    13     PB_13 4.070802
    14     PB_14 3.390919
    15     PB_15 2.227571
    16     PB_16 2.544398
    17     PB_17 1.714579
    18     PB_18 2.745161
    19     PB_19 2.647356
    20     PB_20 3.014730
    21     PB_21 2.686851
    22     PB_22 2.546744

    Aucun problème de multicolinéarité n’a été détecté, tous nos VIF sont inférieurs à 5 pour nos 2 jeux de données.

    Nous allons pouvoir procéder aux étapes suivantes.

    6.3.3 Réalisons l’AFE

    Nos données sont-elles factorisables ? - KMO & Bartlett

    #Avec psych
    ## KMO
    KMO(trainingz_B)
    Kaiser-Meyer-Olkin factor adequacy
    Call: KMO(r = trainingz_B)
    Overall MSA =  0.94
    MSA for each item = 
     PB_1  PB_2  PB_3  PB_4  PB_5  PB_6  PB_7  PB_8  PB_9 PB_10 PB_11 PB_12 PB_13 
     0.93  0.95  0.91  0.94  0.93  0.93  0.97  0.92  0.90  0.95  0.90  0.91  0.95 
    PB_14 PB_15 PB_16 PB_17 PB_18 PB_19 PB_20 PB_21 PB_22 
     0.97  0.92  0.95  0.94  0.93  0.97  0.91  0.96  0.96 
    ## Test de sphéricité
    cortest.bartlett(trainingz_B, n=370)
    $chisq
    [1] 5995.078
    
    $p.value
    [1] 0
    
    $df
    [1] 231
    # Avec performance
    performance::check_factorstructure(trainingz_B)
    # Is the data suitable for Factor Analysis?
    
    
      - Sphericity: Bartlett's test of sphericity suggests that there is sufficient significant correlation in the data for factor analysis (Chisq(231) = 5995.08, p < .001).
      - KMO: The Kaiser, Meyer, Olkin (KMO) overall measure of sampling adequacy suggests that data seems appropriate for factor analysis (KMO = 0.94). The individual KMO scores are: PB_1 (0.93), PB_2 (0.95), PB_3 (0.91), PB_4 (0.94), PB_5 (0.93), PB_6 (0.93), PB_7 (0.97), PB_8 (0.92), PB_9 (0.90), PB_10 (0.95), PB_11 (0.90), PB_12 (0.91), PB_13 (0.95), PB_14 (0.97), PB_15 (0.92), PB_16 (0.95), PB_17 (0.94), PB_18 (0.93), PB_19 (0.97), PB_20 (0.91), PB_21 (0.96), PB_22 (0.96).

    Les indices de sphéricité et de KMO (merveilleux) indiquent que nos données sont factorisables.

    Procédons à l’AFE

    # Nombre de facteurs à conserver
    n <- n_factors(trainingz_B)
    n
    # Method Agreement Procedure:
    
    The choice of 4 dimensions is supported by 5 (26.32%) methods out of 19 (Bentler, beta, Optimal coordinates, Parallel analysis, Kaiser criterion).
    library(see)
    plot(n) + theme_modern()

    #SCREE_PLOT(trainingz_B, corkind="spearman", verbose=T)
    
    AFERP<-lavaan::efa(trainingz_B, nfactors = 4, estimator = "MLR")
    AFERP
    
              f1      f2      f3      f4 
    PB_1   0.936*                        
    PB_2                   0.785*        
    PB_3       .   0.704*                
    PB_4   0.307                   0.640*
    PB_5   0.523*      .*      .         
    PB_6           0.549*          0.536*
    PB_7   0.617*              .       . 
    PB_8                   0.952*      . 
    PB_9       .   0.797*                
    PB_10      .                   0.563*
    PB_11  0.316       .*      .         
    PB_12          0.610*          0.420*
    PB_13  0.774*                      . 
    PB_14  0.355*      .*  0.367*        
    PB_15      .   0.730*                
    PB_16              .       .   0.748*
    PB_17                          0.584*
    PB_18      .       .           0.640*
    PB_19  0.389*      .           0.371*
    PB_20      .           0.991*        
    PB_21              .           0.703*
    PB_22      .                   0.690*

    Une structure en 4 facteurs est proposée avec l’analyse factorielle exploratoire que nous venons de réaliser, et donc non en 6 comme présenté dans l’article. Les estimate ont des valeurs comprises entre 0.37 et 0.99 ce qui témoigne de liens assez forts avec la variable latente.

    6.3.4 Calcul de l’analyse factorielle confirmatoire sur la base test

    Vérifions si cette structure en 4 facteurs se retrouve sur notre second jeu de données.

    1 - Procédons à l’analyse factorielle confirmatoire

    library(lavaan)
    
    attach(testz_B)
    
    model <- 'F1 =~ PB_1 + PB_5 + PB_7 + PB_11 + PB_13 + PB_19
              F2 =~ PB_3 + PB_9 + PB_12 + PB_15
              F3 =~ PB_2 + PB_8 + PB_14 + PB_20
              F4 =~ PB_4 + PB_6 + PB_10 + PB_16 + PB_17 + PB_18 + PB_21 + PB_22'
    
    fit2 <- cfa (model, std.lv=T, estimator="MLR", data=testz_B)

    2- Vérification de l’ajustement du modèle à nos données

    ## Résultat des indices
    
    effectsize::interpret(fit2)
        Name      Value Threshold Interpretation
    1    GFI 0.83347230      0.95           poor
    2   AGFI 0.79245562      0.90           poor
    3    NFI 0.86993845      0.90           poor
    4   NNFI 0.88421239      0.90           poor
    5    CFI 0.89824725      0.90           poor
    6  RMSEA 0.09048906      0.05           poor
    7   SRMR 0.06733462      0.08   satisfactory
    8    RFI 0.85199893      0.90           poor
    9   PNFI 0.76449137      0.50   satisfactory
    10   IFI 0.89871145      0.90           poor

    D’après un panel d’indices le modèle en 4 facteurs s’ajuste de façon satisfaisante aux données (PNFI & SRMR) et de façon tendancielle pour le NFI (0.869), le NNFI (0.884), le CFI (0.885) et l’IFI (0.885).

    3- Extraction des coefficients standardisés

    ## Saturations standardisées
    
    # resid(fit2,type="standardized")

    Les coefficients traduisant le lien entre chaque variable et la variable latente associée (les facteurs) sont plutôt élevés (entre 0.56 et 0.86) ce qui traduit des liens assez forts entre nos variables observées et nos variables latentes.

    4- Observation graphique de la structure obtenue

    # On peut également représenter ce modèle :
    
    semPlot::semPaths(fit2, "std",
                 sizeMan = 8, sizeInt = 8, sizeLat = 8,
                 edge.label.cex=0.8,
                 fade=FALSE)

    La structure décrite dans l’article de Pennycook et al. 2020 n’est pas retrouvée sur les données testées. Toutefois, une autre structure se dégage et est stable sur nos deux échantillons, comme en témoignent les résultats de nos analyses factorielles exploratoires et confirmatoires.

    L’article décrit une échelle en 22 items répartis en 6 catégories de croyances aux phénomènes paranormaux, mais nous retrouvons une structure en 4 facteurs avec les mêmes items sur les mêmes données. Ceci peut être du a plusieurs éléments. Nous n’avons pas d’indication sur le traitement des valeurs extrêmes de la part des auteurs de l’article. De plus, nous n’avons pas d’éléments nous permettant d’affirmer qu’ils ont effectivement partitionné leur jeu de données avant de procéder à leurs analyses factorielles.

    Un autre point à souligner, et pas des moindres, les auteurs n’ont très certainement pas réalisé d’analyse factorielle exploratoire. En effet, à partir du moment où un test psychométrique est validé, c’est-à-dire qu’il a déjà été éprouvé par le couple AFE/AFC sur un jeu de données assez conséquent, avec une population ayant les mêmes caractéristiques, il n’est pas nécessaire de remettre en cause la structure du test et nous pouvons directement procéder à une analyse factorielle confirmatoire, afin de vérifier si le modèle alors pré-établi par d’autres s’ajuste à nos données. Ceci est conseillé afin de ne pas multiplier les tests statistiques et entraîner une inflation des résultats faussements positifs (encore appelés erreur de type II).

    La structure obtenue en 4 facteurs reste cohérente avec la proposition de départ en 6 facteurs. Certains regroupements restent inchangés, d’autres voient quelques modifications (2 items sont majoritairement reliés à un autre facteur latent que celui proposé dans la structure initiale), mais la structure obtenue a du sens et peut tout-à-fait servir de base de discussion à la construction d’outils psychométriques sur le sujet. Pour information, avec notre nouvelle structure nous obtenons la répartition suivante (en anglais) :

    • F1 (Phénomènes parapsychologiques / Fomres de vie extraordinaires): 1. Some individuals are able to levitate (lift) objects through mental forces. ; 5. The abominable snowman of Tibet exists. ; 7. Psychokinesis, the movement of objects through psychic powers, does exist. ; 11. The Loch Ness monster of Scotland exists. ; 13. A person’s thoughts can influence the movement of a physical object. ; 19. Mind reading is not possible
    • F2 (Superstition + item 12 (qui était dans la structure initiale relié majoritairement au facteur “Précognition”)) : 3. Black cats can bring bad luck. ; 9. If you break a mirror, you will have bad luck. ; 12. The horoscope accurately tells a person’s future. ;
      15. The number “13” is unlucky.
    • F3 (Sorcellerie): 2. Black magic really exists. ; 8. Witches do exist. ; 14. Through the use of formulas and incantations, it is possible to cast spells on persons. ; 20. There are actual cases of witchcraft.
    • F4 (Spiritualité / Précognition - item12 + item17 (qui était dans la struture initiale majoritairement relié au facteur latent “Formes de vies extraordinaires”)): 4. Your mind or soul can leave your body and travel (astral projection). ; 6. Astrology is a way to accurately predict the future.; 10. During altered states, such as sleep or trances, the spirit can leave the body.;
      16. Reincarnation does occur. ; 17. There is life on other planets. ; 18. Some psychics can accurately predict the future.; 21. It is possible to communicate with the dead. ; 22. Some people have an unexplained ability to predict the future.
    =======
    modindices(fact_1immo) %>% arrange(-mi) %>% head(20)
                       lhs op                              rhs      mi    epc
    1             prix_med ~~                     perc_log_vac 280.382 -0.418
    2             prix_med ~~                   med_niveau_vis 192.810  0.372
    3         perc_log_vac ~~                    perc_tiny_log 152.154  0.268
    4          perc_maison ~~                    perc_tiny_log 101.598 -0.185
    5        perc_tiny_log ~~                   med_niveau_vis 100.209 -0.233
    6             prix_med ~~                    perc_tiny_log  90.084 -0.176
    7         perc_log_vac ~~                   med_niveau_vis  74.469 -0.287
    8          perc_maison ~~ part_cadre_profintellec_nbemploi  66.500  0.153
    9        perc_tiny_log ~~                         dens_pop  49.380  0.093
    10            dens_pop ~~                   med_niveau_vis  24.475 -0.093
    11        perc_log_vac ~~              part_agri_nb_emploi  23.104  0.133
    12         perc_maison ~~                   med_niveau_vis  22.454  0.116
    13       perc_tiny_log ~~ part_cadre_profintellec_nbemploi  21.143  0.087
    14            dens_pop ~~              part_agri_nb_emploi  19.608  0.070
    15      med_niveau_vis ~~ part_cadre_profintellec_nbemploi  16.626  0.102
    16       perc_tiny_log ~~              part_agri_nb_emploi  12.220  0.070
    17 part_agri_nb_emploi ~~ part_cadre_profintellec_nbemploi  11.370 -0.072
    18            prix_med ~~                         dens_pop   9.173 -0.044
    19      med_niveau_vis ~~              part_agri_nb_emploi   6.315 -0.075
    20            prix_med ~~ part_cadre_profintellec_nbemploi   4.958 -0.043
       sepc.lv sepc.all sepc.nox
    1   -0.418   -0.728   -0.728
    2    0.372    0.601    0.601
    3    0.268    0.608    0.608
    4   -0.185   -0.629   -0.629
    5   -0.233   -0.490   -0.490
    6   -0.176   -0.516   -0.516
    7   -0.287   -0.358   -0.358
    8    0.153    0.459    0.459
    9    0.093    0.389    0.389
    10  -0.093   -0.216   -0.216
    11   0.133    0.206    0.206
    12   0.116    0.217    0.217
    13   0.087    0.292    0.292
    14   0.070    0.201    0.201
    15   0.102    0.188    0.188
    16   0.070    0.183    0.183
    17  -0.072   -0.164   -0.164
    18  -0.044   -0.141   -0.141
    19  -0.075   -0.107   -0.107
    20  -0.043   -0.112   -0.112
    modindices(fact_2immo) %>% arrange(-mi) %>% head(20)
                       lhs op                              rhs     mi    epc
    1       med_niveau_vis ~~ part_cadre_profintellec_nbemploi 65.070  0.170
    2          perc_maison ~~ part_cadre_profintellec_nbemploi 56.636  0.139
    3                   F1 =~                    perc_tiny_log 44.716 -0.183
    4         perc_log_vac ~~                    perc_tiny_log 44.511  0.097
    5         perc_log_vac ~~              part_agri_nb_emploi 43.073  0.142
    6                   F1 =~                      perc_maison 32.818 -0.167
    7  part_agri_nb_emploi ~~ part_cadre_profintellec_nbemploi 30.777 -0.122
    8             prix_med ~~                      perc_maison 29.347 -0.066
    9          perc_maison ~~                    perc_tiny_log 23.831 -0.092
    10       perc_tiny_log ~~              part_agri_nb_emploi 23.239  0.092
    11      med_niveau_vis ~~                    perc_tiny_log 18.283 -0.073
    12      med_niveau_vis ~~              part_agri_nb_emploi 15.982 -0.103
    13      med_niveau_vis ~~                      perc_maison 15.147  0.076
    14                  F2 =~                         prix_med 14.438 -0.268
    15        perc_log_vac ~~                   med_niveau_vis 14.438 -0.112
    16         perc_maison ~~                         dens_pop 12.976  0.046
    17            prix_med ~~ part_cadre_profintellec_nbemploi 11.994 -0.045
    18            dens_pop ~~              part_agri_nb_emploi 10.148  0.051
    19       perc_tiny_log ~~                         dens_pop  9.344  0.039
    20            prix_med ~~              part_agri_nb_emploi  8.306  0.045
       sepc.lv sepc.all sepc.nox
    1    0.170    0.337    0.337
    2    0.139    0.414    0.414
    3   -0.183   -0.183   -0.183
    4    0.097    0.334    0.334
    5    0.142    0.252    0.252
    6   -0.167   -0.171   -0.171
    7   -0.122   -0.256   -0.256
    8   -0.066   -0.331   -0.331
    9   -0.092   -0.412   -0.412
    10   0.092    0.291    0.291
    11  -0.073   -0.218   -0.218
    12  -0.103   -0.158   -0.158
    13   0.076    0.165    0.165
    14  -0.268   -0.285   -0.285
    15  -0.112   -0.188   -0.188
    16   0.046    0.184    0.184
    17  -0.045   -0.207   -0.207
    18   0.051    0.142    0.142
    19   0.039    0.211    0.211
    20   0.045    0.160    0.160
    >>>>>>> master

    Conclusion

    <<<<<<< HEAD

    Nous avons ainsi présenté pas à pas trois exemples différents d’utilisation de l’AFE et en suivant de la CFA. L’idée était de présenter une méthode ancienne mais peu utilisée en dehors de la Psychologie. Il ne s’agit pas de remplacer l’ACP mais de proposer une alternative, et surtout de proposer aux usagers de faire un choix conscient sur la méthode plutôt que de répondre à une habitude disciplinaire.

    =======

    Nous avons ainsi présenté pas à pas un exemple d’utilisation de l’AFE et en suivant de la CFA. L’idée était de présenter une méthode ancienne mais peu utilisée en dehors de la Psychologie. Il ne s’agit pas de remplacer l’ACP mais de proposer une alternative, et surtout de proposer aux usagers de faire un choix conscient sur la méthode plutôt que de répondre à une habitude disciplinaire.

    >>>>>>> master

    Ainsi, si vous souhaitez explorer vos données et identifier des facteurs latents corrélés (ou non) afin de faire émerger une structure synthétique, voir si la structure observée est cohérente avec un modèle théorique, ou encore si cette structure observée est stable dans le temps, alors l’utilisation du couple entre AFE/CFA est tout-à-fait <<<<<<< HEAD pertinente.

    ======= pertinente. On peut en effet tester si un modèle éprouvé sur des données récoltées en 2011, serait bien le même en 2023 où s’il aurait subi des modifications, liées au contexte du sujet étudié.

    >>>>>>> master

    Bibliographie

      <<<<<<< HEAD =======
    • Aguinis, H., Gottfredson, R. K., & Joo, H. (2013). Best-Practice Recommendations for Defining, Identifying, and Handling Outliers. Organizational Research Methods, 16(2), 270-301. https://doi.org/10.1177/1094428112470848

    • Bakker, M., & Wicherts, J. M. (2014). Outlier removal, sum scores, and the inflation of the type I error rate in independent samples t tests: The power of alternatives and recommendations. Psychological Methods, 19(3), 409–427. https://doi.org/10.1037/met0000014

    • >>>>>>> master
    • Bartlett, M.S. (1937) Properties of Sufficiency and Statistical Test. Proceedings of the Royal Society A, 160, 268-282. https://doi.org/10.1098/rspa.1937.0109

    • Benzecri J.-P. (1973), L’analyse des données, Paris, Dunod, vol. 2 : Correspondances

    • Farrar, D. E., & Glauber, R. R. (1967). Multicollinearity in Regression Analysis: The Problem Revisited. The Review of Economics and Statistics, 49(1), 92–107. https://doi.org/10.2307/1937887.

    • Flora, D. B., & Flake, J. K. (2017), The purpose and practice of exploratory and confirmatory factor analysis in psychological research: Decisions for scale development and validation. Canadian Journal of Behavioural Science / Revue canadienne des sciences du comportement, 49(2), 78–88. https://doi.org/10.1037/cbs0000069

    • <<<<<<< HEAD
    • Gnanadesikan, R., & Kettenring, J. R. (1972), Robust Estimates, Residuals, and Outlier Detection with Multiresponse Data. Biometrics, 28(1), 81–124. https://doi.org/10.2307/2528963

    • ======= >>>>>>> master
    • Hooper, D., Coughlan, J., & Mullen, M. R. (2008), Structural Equation Modelling: Guidelines for Determining Model Fit. The Electronic Journal of Business Research Methods, 6, 53-60.

    • Kaiser, H.F. (1974) An index of factorial simplicity. Psychometrika 39, 31–36. https://doi.org/10.1007/BF02291575

    • Kyriazos, T. and Poga, M. (2023) Dealing with Multicollinearity in Factor Analysis: The Problem, Detections, and Solutions. Open Journal of Statistics, 13, 404-424. doi: 10.4236/ojs.2023.133020

    • Kyriazos, T. and Poga-Kyriazou, M. (2023) Applied Psychometrics: Estimator Considerations in Commonly Encountered Conditions in CFA, SEM, and EFA Practice. Psychology, 14, 799-828. doi: https://doi.org/10.4236/psych.2023.145043

    • Leys, C., Klein, O., Dominicy, Y., and Ley., C., 2018, “Detecting Multivariate Outliers: Use a Robust Variant of the Mahalanobis Distance.” Journal of Experimental Social Psychology 74: 150–56. https://doi.org/10.1016/j.jesp.2017.09.011

    • <<<<<<< HEAD
    • Mahalanobis, P., C., 1936, « On the generalised distance in statistics », Proceedings of the National Institute of Sciences of India, vol. 2, no 1,‎ 1936, p. 49–55

    • =======
    • Leys, C., et al. (2019). How to Classify, Detect, and Manage Univariate and Multivariate Outliers, With Emphasis on Pre-Registration. International Review of Social Psychology, 32(1): 5, 1–10. DOI: https://doi.org/10.5334/irsp.289

    • >>>>>>> master
    • Makowski, (2018). The psycho Package: an Efficient and Publishing-Oriented Workflow for Psychological Science. Journal of Open Source Software, 3(22), 470. https://doi.org/10.21105/joss.00470

    • Pages, J-P., et al., (1979), Analyse factorielle : Un peu d’histoire et de géométrie, Revue de statistiques appliquée, tome 27, n°1, p.5-28.

    • Pearson F.R.S., K. (1901) LIII. On lines and planes of closest fit to systems of points in space, The London, Edinburgh, and Dublin Philosophical Magazine and Journal of Science, 2:11, 559-572, DOI: 10.1080/14786440109462720

    • <<<<<<< HEAD
    • Pennycook G, Cheyne JA, Koehler DJ, Fugelsang JA, 2020, On the belief that beliefs should change according to evidence: Implications for conspiratorial, moral, paranormal, political, religious, and science beliefs. Judgment and Decision Making. 2020;15(4):476-498. doi:[10.1017/S1930297500007439](https://doi.org/10.1017/S1930297500007439)

    • =======
    • Schreiber, J.B., (2021), Issues and recommendations for exploratory factor analysis and principal component analysis, Research in Social and Administrative Pharmacy, Volume 17, Issue 5, 2021, Pages 1004-1011, ISSN 1551-7411, https://doi.org/10.1016/j.sapharm.2020.07.027.

    • >>>>>>> master
    • Spearman, C. (1904). The Proof and Measurement of Association between Two Things. The American Journal of Psychology, 15(1), 72–101. https://doi.org/10.2307/1412159

    • Tabachnick, B., & Fidell, L., (2014), Using Multivariate Statistics (6th ed.). Harlow: Pearson Education

    • <<<<<<< HEAD
    • Van Laar, S., & Braeken, J., 2021, Understanding the Comparative Fit Index : It’s All About Base !, Practical Assessment, Reasearch & Evaluation, Vol 26, N°26

    • =======
    • Tobacyk, J., & Milford, G. (1983). Belief in paranormal phenomena: Assessment instrument development and implications for personality functioning. Journal of personality and social psychology, 44(5), 1029.

    • Tobacyk, J. J., Nagot, E., & Miller, M. (1988). Paranormal Beliefs and Locus of Control: A Multidimensional Examination. Journal of Personality Assessment, 52(2), 241–246. https://doi.org/10.1207/s15327752jpa5202_5

    • Tobacyk, J. J. (2004). A revised paranormal belief scale. International Journal of Transpersonal Studies, 23(1), 94–98.. International Journal of Transpersonal Studies, 23 (1). http://dx.doi.org/10.24972/ijts.2004.23.1.94

    • Van Laar, S., & Braeken, J., 2021, Understanding the Comparative Fit Index : It’s All About Base !, Practical Assessment, Reasearch & Evaluation, Vol 26, N°26

    • Watkins, M. W. (2018). Exploratory Factor Analysis: A Guide to Best Practice. Journal of Black Psychology, 44(3), 219-246. https://doi.org/10.1177/0095798418771807

    • >>>>>>> master
    • Yong, A. G., & Pearce, S. (2013) A Beginner’s Guide to Factor Analysis: Focusing on Exploratory Factor Analysis, Tutorials in Quantitative Methods for Psychology, 9(2), 79-94. doi: 10.20982/tqmp.09.2.p079

    • Zijlstra, W. P., van der Ark, L. A., & Sijtsma, K. (2011). Outliers in Questionnaire Data: Can They Be Detected and Should They Be Removed? Journal of Educational and Behavioral Statistics, 36(2), 186–212. http://www.jstor.org/stable/29789477

    Annexes

    Info session

    <<<<<<< HEAD =======
    >>>>>>> master
    setting value
    version <<<<<<< HEAD R version 4.2.2 (2022-10-31 ucrt) ======= R version 4.4.2 (2024-10-31) >>>>>>> master
    os <<<<<<< HEAD Windows 10 x64 (build 22631) ======= Ubuntu 22.04.5 LTS >>>>>>> master
    system <<<<<<< HEAD x86_64, mingw32 ======= x86_64, linux-gnu >>>>>>> master
    ui <<<<<<< HEAD RTerm ======= X11 >>>>>>> master
    language <<<<<<< HEAD (EN) ======= fr_FR:en >>>>>>> master
    collate <<<<<<< HEAD French_France.utf8 ======= fr_FR.UTF-8 >>>>>>> master
    ctype <<<<<<< HEAD French_France.utf8 ======= fr_FR.UTF-8 >>>>>>> master
    tz Europe/Paris
    date <<<<<<< HEAD 2024-05-21 ======= 2024-12-18 >>>>>>> master
    pandoc <<<<<<< HEAD 3.1.1 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown) ======= 3.1.1 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown) >>>>>>> master
    <<<<<<< HEAD =======
    >>>>>>> master
    package ondiskversion source
    correlation <<<<<<< HEAD 0.8.4 CRAN (R 4.2.3) ======= 0.8.6 CRAN (R 4.4.2) >>>>>>> master
    corrplot <<<<<<< HEAD 0.92 CRAN (R 4.2.2) ======= 0.95 CRAN (R 4.4.2) >>>>>>> master
    dplyr <<<<<<< HEAD 1.1.2 CRAN (R 4.2.3) ======= 1.1.4 CRAN (R 4.4.2) >>>>>>> master
    EFA.dimensions <<<<<<< HEAD 0.1.7.7 CRAN (R 4.2.3) ======= 0.1.8.4 CRAN (R 4.4.2)
    effectsize 0.8.9 CRAN (R 4.4.2) >>>>>>> master
    ggplot2 <<<<<<< HEAD 3.4.2 CRAN (R 4.2.3) ======= 3.5.1 CRAN (R 4.4.2) >>>>>>> master
    ggraph <<<<<<< HEAD 2.1.0 CRAN (R 4.2.2) ======= 2.2.1 CRAN (R 4.4.2) >>>>>>> master
    here 1.0.1 <<<<<<< HEAD CRAN (R 4.2.2) ======= CRAN (R 4.4.2) >>>>>>> master
    lattice <<<<<<< HEAD 0.20.45 CRAN (R 4.2.2) ======= 0.22.5 CRAN (R 4.3.1) >>>>>>> master
    lavaan <<<<<<< HEAD 0.6.16 CRAN (R 4.2.3) ======= 0.6.19 CRAN (R 4.4.2) >>>>>>> master
    nFactors 2.4.1.1 <<<<<<< HEAD CRAN (R 4.2.3) ======= CRAN (R 4.4.2) >>>>>>> master
    pacman 0.5.1 <<<<<<< HEAD CRAN (R 4.2.3) ======= CRAN (R 4.4.2) >>>>>>> master
    parameters <<<<<<< HEAD 0.21.1 CRAN (R 4.2.3)
    performance 0.10.4 CRAN (R 4.2.3) ======= 0.23.0 CRAN (R 4.4.2) >>>>>>> master
    psych <<<<<<< HEAD 2.3.6 CRAN (R 4.2.3) ======= 2.4.6.26 CRAN (R 4.4.2) >>>>>>> master
    RColorBrewer 1.1.3 <<<<<<< HEAD CRAN (R 4.2.0)
    robustbase 0.99.0 CRAN (R 4.2.3)
    rrcov 1.7.5 CRAN (R 4.2.3) ======= CRAN (R 4.1.3) >>>>>>> master
    see <<<<<<< HEAD 0.8.0 CRAN (R 4.2.3) ======= 0.9.0 CRAN (R 4.4.2) >>>>>>> master
    table1 1.4.3 <<<<<<< HEAD CRAN (R 4.2.3) ======= CRAN (R 4.4.2) >>>>>>> master
    terra <<<<<<< HEAD 1.7.3 CRAN (R 4.2.2) ======= 1.8.5 CRAN (R 4.4.2) >>>>>>> master
    usdm 2.1.7 <<<<<<< HEAD CRAN (R 4.2.3) ======= CRAN (R 4.4.2) >>>>>>> master

    Citation

    Auteur.e P, Auteur.e S (2021). “Titre de la fiche.” doi:10.48645/xxxxxx, https://doi.org/10.48645/xxxxxx,, https://rzine.fr/publication_rzine/xxxxxxx/.

    BibTex :

    @Misc{,
      title = {Titre de la fiche},
      subtitle = {Sous-Titre de la fiche},
      author = {Premier Auteur.e and Second Auteur.e},
      doi = {10.48645/xxxxxx},
      url = {https://rzine.fr/publication_rzine/xxxxxxx/},
      keywords = {FOS: Other social sciences},
      language = {fr},
      publisher = {FR2007 CIST},
      year = {2021},
      copyright = {Creative Commons Attribution Share Alike 4.0 International},
    }


    Glossaire